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)