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)