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

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

     [ 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)