You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Michele Preti (Jira)" <ji...@apache.org> on 2020/02/18 13:04:00 UTC

[jira] [Created] (LANG-1518) MethodUtils.getAnnotation() with searchSupers =true does not work if super is generic

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)