[SPR-3635] [SPR-5039] [SPR-5813] JMX annotation inheritance fixed

This commit is contained in:
Rob Harrop
2009-09-08 21:37:02 +00:00
parent 7f7173f790
commit 8f6a42bf64
10 changed files with 177 additions and 11 deletions

View File

@@ -101,6 +101,9 @@ public abstract class AnnotationUtils {
public static <A extends Annotation> A findAnnotation(Method method, Class<A> annotationType) {
A annotation = getAnnotation(method, annotationType);
Class<?> cl = method.getDeclaringClass();
if(annotation == null) {
annotation = searchForAnnotationOnInterfaces(method, annotationType, cl.getInterfaces());
}
while (annotation == null) {
cl = cl.getSuperclass();
if (cl == null || cl == Object.class) {
@@ -109,6 +112,9 @@ public abstract class AnnotationUtils {
try {
Method equivalentMethod = cl.getDeclaredMethod(method.getName(), method.getParameterTypes());
annotation = getAnnotation(equivalentMethod, annotationType);
if(annotation == null) {
annotation = searchForAnnotationOnInterfaces(method, annotationType, cl.getInterfaces());
}
}
catch (NoSuchMethodException ex) {
// We're done...
@@ -117,6 +123,24 @@ public abstract class AnnotationUtils {
return annotation;
}
private static <A extends Annotation> A searchForAnnotationOnInterfaces(Method method, Class<A> annotationType, Class[] ifaces) {
A annotation = null;
for (Class<?> iface : ifaces) {
Method equivalentMethod = null;
try {
equivalentMethod = iface.getDeclaredMethod(method.getName(), method.getParameterTypes());
annotation = getAnnotation(equivalentMethod, annotationType);
}
catch (NoSuchMethodException e) {
// skip this interface - it doesn't have the method
}
if (annotation != null) {
break;
}
}
return annotation;
}
/**
* Find a single {@link Annotation} of <code>annotationType</code> from the
* supplied {@link Class}, traversing its interfaces and super classes