Michele Preti created LANG-1518:
-----------------------------------

             Summary: MethodUtils.getAnnotation() with searchSupers =true does 
not work if super is generic
                 Key: LANG-1518
                 URL: https://issues.apache.org/jira/browse/LANG-1518
             Project: Commons Lang
          Issue Type: Bug
          Components: lang.reflect.*
    Affects Versions: 3.9
            Reporter: Michele Preti


 
{code:java}
public static class Foo<T> {
        @Nonnull
        protected void test(T i) {
                System.out.println("foo" + i);
        }
}

public static class Bar extends Foo<Integer> {
        @Override
        protected void test(Integer i) {
                System.out.println("bar" + i);
        }
}

public static void main(String[] args) throws NoSuchMethodException, 
SecurityException {
        Method testMethod = Bar.class.getDeclaredMethod("test", Integer.class);
        
        System.out.println(MethodUtils.getAnnotation(testMethod, Nonnull.class, 
true, true)); //==null
}
{code}
 

the method MethodUtils.getAnnotation() should be modified as souch:

(using 
*MethodUtils.getMatchingMethod*/*MethodUtils.getMatchingAccessibleMethod* 
instead of *getDeclaredMethod*/*getMethod*)
{code:java}
public static <A extends Annotation> A getAnnotation(final Method method, final 
Class<A> annotationCls,
                final boolean searchSupers, final boolean ignoreAccess) {

        Validate.isTrue(method != null, "The method must not be null");
        Validate.isTrue(annotationCls != null, "The annotation class must not 
be null");
        if (!ignoreAccess && !MemberUtils.isAccessible(method)) {
                return null;
        }

        A annotation = method.getAnnotation(annotationCls);

        if (annotation == null && searchSupers) {
                final Class<?> mcls = method.getDeclaringClass();
                final List<Class<?>> classes = 
getAllSuperclassesAndInterfaces(mcls);
                for (final Class<?> acls : classes) {
                        Method equivalentMethod = (ignoreAccess
                                        ? MethodUtils.getMatchingMethod(acls, 
method.getName(), method.getParameterTypes())
                                        : 
MethodUtils.getMatchingAccessibleMethod(acls, method.getName(), 
method.getParameterTypes()));
                        if (equivalentMethod == null) {
                                continue;
                        }
                        annotation = 
equivalentMethod.getAnnotation(annotationCls);
                        if (annotation != null) {
                                break;
                        }
                }
        }

        return annotation;
}
{code}
 

 



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to