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/18 13:36:00 UTC

[jira] [Commented] (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:comment-tabpanel&focusedCommentId=17039085#comment-17039085 ] 

Gary D. Greg/ry commented on LANG-1518:
---------------------------------------

[~lelmarir]

Thank you for your report.

May you please provide a PR on GitHub with a test?

Gary

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