Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
3.9
-
None
Description
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 }
the method MethodUtils.getAnnotation() should be modified as souch:
(using MethodUtils.getMatchingMethod/MethodUtils.getMatchingAccessibleMethod instead of getDeclaredMethod/getMethod)
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; }
Attachments
Issue Links
- links to