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)