This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-lang.git
The following commit(s) were added to refs/heads/master by this push: new f4c2ed4 LANG-1518 - fix searchSupers for generic classes (#494) f4c2ed4 is described below commit f4c2ed4995d19c595ec0bf5c49d210df9046fda9 Author: Michele Preti <lelma...@gmail.com> AuthorDate: Sat Feb 22 14:28:33 2020 +0100 LANG-1518 - fix searchSupers for generic classes (#494) * fix searchSupers for generic classes * fix checkstyle --- .../org/apache/commons/lang3/reflect/MethodUtils.java | 18 +++++++----------- .../apache/commons/lang3/reflect/MethodUtilsTest.java | 18 ++++++++++++++++++ .../commons/lang3/reflect/testbed/GenericParent.java | 6 ++++++ .../reflect/testbed/StringParameterizedChild.java | 15 +++++++++++++++ 4 files changed, 46 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/apache/commons/lang3/reflect/MethodUtils.java b/src/main/java/org/apache/commons/lang3/reflect/MethodUtils.java index c014450..f724c5c 100644 --- a/src/main/java/org/apache/commons/lang3/reflect/MethodUtils.java +++ b/src/main/java/org/apache/commons/lang3/reflect/MethodUtils.java @@ -974,17 +974,13 @@ public class MethodUtils { final Class<?> mcls = method.getDeclaringClass(); final List<Class<?>> classes = getAllSuperclassesAndInterfaces(mcls); for (final Class<?> acls : classes) { - Method equivalentMethod; - try { - equivalentMethod = (ignoreAccess ? acls.getDeclaredMethod(method.getName(), method.getParameterTypes()) - : acls.getMethod(method.getName(), method.getParameterTypes())); - } catch (final NoSuchMethodException e) { - // if not found, just keep searching - continue; - } - annotation = equivalentMethod.getAnnotation(annotationCls); - if (annotation != null) { - break; + Method equivalentMethod = (ignoreAccess ? MethodUtils.getMatchingMethod(acls, method.getName(), method.getParameterTypes()) + : MethodUtils.getMatchingAccessibleMethod(acls, method.getName(), method.getParameterTypes())); + if (equivalentMethod != null) { + annotation = equivalentMethod.getAnnotation(annotationCls); + if (annotation != null) { + break; + } } } } diff --git a/src/test/java/org/apache/commons/lang3/reflect/MethodUtilsTest.java b/src/test/java/org/apache/commons/lang3/reflect/MethodUtilsTest.java index 168bc2a..ab40b22 100644 --- a/src/test/java/org/apache/commons/lang3/reflect/MethodUtilsTest.java +++ b/src/test/java/org/apache/commons/lang3/reflect/MethodUtilsTest.java @@ -799,6 +799,15 @@ public class MethodUtilsTest { Annotated.class, true, true)); assertNotNull(MethodUtils.getAnnotation(PublicChild.class.getMethod("publicAnnotatedMethod"), Annotated.class, true, true)); + + assertNull(MethodUtils.getAnnotation(StringParameterizedChild.class.getMethod("parentNotAnnotatedMethod", String.class), + Annotated.class, true, true)); + assertNotNull(MethodUtils.getAnnotation(StringParameterizedChild.class.getMethod("parentProtectedAnnotatedMethod", String.class), + Annotated.class, true, true)); + assertNotNull(MethodUtils.getAnnotation(StringParameterizedChild.class.getDeclaredMethod("privateAnnotatedMethod", String.class), + Annotated.class, true, true)); + assertNotNull(MethodUtils.getAnnotation(StringParameterizedChild.class.getMethod("publicAnnotatedMethod", String.class), + Annotated.class, true, true)); } @Test @@ -827,6 +836,15 @@ public class MethodUtilsTest { Annotated.class, true, false)); assertNotNull(MethodUtils.getAnnotation(PublicChild.class.getMethod("publicAnnotatedMethod"), Annotated.class, true, false)); + + assertNull(MethodUtils.getAnnotation(StringParameterizedChild.class.getMethod("parentNotAnnotatedMethod", String.class), + Annotated.class, true, false)); + assertNull(MethodUtils.getAnnotation(StringParameterizedChild.class.getMethod("parentProtectedAnnotatedMethod", String.class), + Annotated.class, true, false)); + assertNull(MethodUtils.getAnnotation(StringParameterizedChild.class.getDeclaredMethod("privateAnnotatedMethod", String.class), + Annotated.class, true, false)); + assertNotNull(MethodUtils.getAnnotation(StringParameterizedChild.class.getMethod("publicAnnotatedMethod", String.class), + Annotated.class, true, false)); } @Test diff --git a/src/test/java/org/apache/commons/lang3/reflect/testbed/GenericParent.java b/src/test/java/org/apache/commons/lang3/reflect/testbed/GenericParent.java index f848567..73b1446 100644 --- a/src/test/java/org/apache/commons/lang3/reflect/testbed/GenericParent.java +++ b/src/test/java/org/apache/commons/lang3/reflect/testbed/GenericParent.java @@ -25,4 +25,10 @@ public class GenericParent<T> implements GenericConsumer<T> { public void consume(final T t) { } + @Annotated + protected void parentProtectedAnnotatedMethod(final T t) { + } + + public void parentNotAnnotatedMethod(final T t) { + } } diff --git a/src/test/java/org/apache/commons/lang3/reflect/testbed/StringParameterizedChild.java b/src/test/java/org/apache/commons/lang3/reflect/testbed/StringParameterizedChild.java index dd285bc..36b7156 100644 --- a/src/test/java/org/apache/commons/lang3/reflect/testbed/StringParameterizedChild.java +++ b/src/test/java/org/apache/commons/lang3/reflect/testbed/StringParameterizedChild.java @@ -24,4 +24,19 @@ public class StringParameterizedChild extends GenericParent<String> { public void consume(final String t) { super.consume(t); } + + @Override + public void parentProtectedAnnotatedMethod(final String t) { + } + + public void parentNotAnnotatedMethod(final String t) { + } + + @Annotated + private void privateAnnotatedMethod(final String t) { + } + + @Annotated + public void publicAnnotatedMethod(final String t) { + } }