[ 
https://issues.apache.org/jira/browse/LANG-1518?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Gary D. Gregory resolved LANG-1518.
-----------------------------------
    Fix Version/s: 3.10
       Resolution: Fixed

In git master.

> 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
>            Priority: Major
>             Fix For: 3.10
>
>          Time Spent: 2h 10m
>  Remaining Estimate: 0h
>
>  
> {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