final Class<?> clazz = bean.getClass();
ReflectionUtils.doWithMethods(clazz, new ReflectionUtils.MethodCallback() {
public void doWith(Method method) {
Reference annotation = (Reference) method.getAnnotation(getReferenceAnnotationType());
if (annotation != null) {
if (Modifier.isStatic(method.getModifiers())) {
throw new IllegalStateException("Reference annotation is not supported on static methods");
}
if (Modifier.isPrivate(method.getModifiers())) {
throw new IllegalStateException("Reference annotation is not supported on private methods");
}
if (method.getParameterTypes().length == 0) {
throw new IllegalStateException("Reference annotation requires at least one argument: " + method);
}
PropertyDescriptor pd = BeanUtils.findPropertyForMethod(method);
if (pd != null) {
String refName = annotation.name();
if ("".equals(refName)) {
injectReference(bean, pd, pd.getName());
} else {
injectReference(bean, pd, refName);
}
}
}
}
});
ReflectionUtils.doWithFields(clazz, new ReflectionUtils.FieldCallback() {
public void doWith(Field field) {
Reference annotation = (Reference) field.getAnnotation(getReferenceAnnotationType());
if (annotation != null) {
if (Modifier.isStatic(field.getModifiers())) {
throw new IllegalStateException("Reference annotation is not supported on static fields");
}
if (Modifier.isPrivate(field.getModifiers())) {
throw new IllegalStateException("Reference annotation is not supported on private fields");
}
ReflectionUtils.makeAccessible(field);
Object referenceObj = null;
String refName = annotation.name();
if ("".equals(refName)) {
referenceObj = component.getService(field.getType(), field.getName());
} else {
referenceObj = component.getService(field.getType(), refName);
}