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)