jodd-madvoc/src/main/java/jodd/madvoc/component/ScopeDataInspector.java
public ScopeData inspectClassScopes(final Class actionClass) {
		ClassDescriptor cd = ClassIntrospector.get().lookup(actionClass);

		PropertyDescriptor[] allProperties = cd.getAllPropertyDescriptors();

		List<InjectionPoint> listIn = new ArrayList<>(allProperties.length);
		List<InjectionPoint> listOut = new ArrayList<>(allProperties.length);

		for (PropertyDescriptor pd : allProperties) {
			// collect annotations

			Class<? extends MadvocScope> scope = null;
			In in = null;
			Out out = null;

			if (pd.getFieldDescriptor() != null) {
				Field field = pd.getFieldDescriptor().getField();

				in = field.getAnnotation(In.class);
				out = field.getAnnotation(Out.class);
				scope = resolveScopeClassFromAnnotations(field.getAnnotations());
			}

			if (pd.getWriteMethodDescriptor() != null) {
				Method method = pd.getWriteMethodDescriptor().getMethod();
				if (in == null) {
					in = method.getAnnotation(In.class);
				}
				if (out == null) {
					out = method.getAnnotation(Out.class);
				}
				if (scope == null) {
					scope = resolveScopeClassFromAnnotations(method.getAnnotations());
				}
			}

			if (pd.getReadMethodDescriptor() != null) {
				Method method = pd.getReadMethodDescriptor().getMethod();
				if (in == null) {
					in = method.getAnnotation(In.class);
				}
				if (out == null) {
					out = method.getAnnotation(Out.class);
				}
				if (scope == null) {
					scope = resolveScopeClassFromAnnotations(method.getAnnotations());
				}
			}

			// inspect all

			final InjectionPoint ii = in == null ? null : buildInjectionPoint(in.value(), pd.getName(), pd.getType(), scope);
			if (ii != null) {
				listIn.add(ii);
			}

			final InjectionPoint oi = out == null ? null : buildInjectionPoint(out.value(), pd.getName(), pd.getType(), scope);
			if (oi != null) {
				listOut.add(oi);
			}
		}

		if ((listIn.isEmpty()) && (listOut.isEmpty())) {
			return NO_SCOPE_DATA;
		}

		InjectionPoint[] in = null;
		InjectionPoint[] out = null;

		if (!listIn.isEmpty()) {
			in = listIn.toArray(new InjectionPoint[0]);
		}
		if (!listOut.isEmpty()) {
			out = listOut.toArray(new InjectionPoint[0]);
		}

		return new ScopeData(this, in, out);
	}
public ScopeData inspectClassScopes(final Class actionClass) {
		ClassDescriptor cd = ClassIntrospector.get().lookup(actionClass);

		PropertyDescriptor[] allProperties = cd.getAllPropertyDescriptors();

		List<InjectionPoint> listIn = new ArrayList<>(allProperties.length);
		List<InjectionPoint> listOut = new ArrayList<>(allProperties.length);

		for (PropertyDescriptor pd : allProperties) {
			// collect annotations

			Class<? extends MadvocScope> scope = null;
			In in = null;
			Out out = null;

			if (pd.getFieldDescriptor() != null) {
				Field field = pd.getFieldDescriptor().getField();

				in = field.getAnnotation(In.class);
				out = field.getAnnotation(Out.class);
				scope = resolveScopeClassFromAnnotations(field.getAnnotations());
			}

			if (pd.getWriteMethodDescriptor() != null) {
				Method method = pd.getWriteMethodDescriptor().getMethod();
				if (in == null) {
					in = method.getAnnotation(In.class);
				}
				if (out == null) {
					out = method.getAnnotation(Out.class);
				}
				if (scope == null) {
					scope = resolveScopeClassFromAnnotations(method.getAnnotations());
				}
			}

			if (pd.getReadMethodDescriptor() != null) {
				Method method = pd.getReadMethodDescriptor().getMethod();
				if (in == null) {
					in = method.getAnnotation(In.class);
				}
				if (out == null) {
					out = method.getAnnotation(Out.class);
				}
				if (scope == null) {
					scope = resolveScopeClassFromAnnotations(method.getAnnotations());
				}
			}

			// inspect all

			final InjectionPoint ii = in == null ? null : buildInjectionPoint(in.value(), pd.getName(), pd.getType(), scope);
			if (ii != null) {
				listIn.add(ii);
			}

			final InjectionPoint oi = out == null ? null : buildInjectionPoint(out.value(), pd.getName(), pd.getType(), scope);
			if (oi != null) {
				listOut.add(oi);
			}
		}

		if ((listIn.isEmpty()) && (listOut.isEmpty())) {
			return NO_SCOPE_DATA;
		}

		InjectionPoint[] in = null;
		InjectionPoint[] out = null;

		if (!listIn.isEmpty()) {
			in = listIn.toArray(new InjectionPoint[0]);
		}
		if (!listOut.isEmpty()) {
			out = listOut.toArray(new InjectionPoint[0]);
		}

		return new ScopeData(this, in, out);
	}
Inspects {@link ScopeData} for given class. The results are not cached, so it should
be used only dyring configuration-time.
For cached version, use {@link #inspectClassScopesWithCache(Class)}.