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
commit af1598229fca5808042ed20f50c36a4fe923c915 Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Sun Nov 3 11:23:36 2024 -0500 [LANG-1757] NullPointerException in MethodUtils.getMatchingAccessibleMethod(Class<?>, String, Class<?>...) --- src/changes/changes.xml | 1 + .../apache/commons/lang3/reflect/MethodUtils.java | 3 +- .../commons/lang3/reflect/MethodUtilsTest.java | 85 +++++++++------------- 3 files changed, 36 insertions(+), 53 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index e3a149a22..324720d81 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -61,6 +61,7 @@ The <action> type attribute can be add,update,fix,remove. <action issue="LANG-1753" type="fix" dev="ggregory" due-to="Capt. Cutlass">StringUtils.replaceEachRepeatedly regression in 3.11+ #1297.</action> <action type="fix" dev="ggregory" due-to="Capt. Cutlass">Use simplified JUnit assertion methods #1298.</action> <action issue="LANG-1682" type="fix" dev="ggregory" due-to="Capt. Cutlass">Javadoc and test: Use Strings.CI.startsWithAny method instead #1299.</action> + <action issue="LANG-1757" type="fix" dev="ggregory" due-to="Gary Gregory">Fix NullPointerException in MethodUtils.getMatchingAccessibleMethod((Class, String, Class...)).</action> <!-- ADD --> <action type="add" dev="ggregory" due-to="Gary Gregory">Add Strings and refactor StringUtils.</action> <action issue="LANG-1747" type="add" dev="ggregory" due-to="Oliver B. Fischer, Gary Gregory">Add StopWatch.run([Failable]Runnable) and get([Failable]Supplier).</action> 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 8db0bd5a9..86594fd77 100644 --- a/src/main/java/org/apache/commons/lang3/reflect/MethodUtils.java +++ b/src/main/java/org/apache/commons/lang3/reflect/MethodUtils.java @@ -349,7 +349,8 @@ public class MethodUtils { final Class<?> lastParameterType = parameterTypes[parameterTypes.length - 1]; final String parameterTypeName = lastParameterType == null ? null : lastParameterType.getName(); - final String parameterTypeSuperClassName = lastParameterType == null ? null : lastParameterType.getSuperclass().getName(); + final String parameterTypeSuperClassName = lastParameterType == null ? null + : lastParameterType.getSuperclass() != null ? lastParameterType.getSuperclass().getName() : null; if (parameterTypeName != null && parameterTypeSuperClassName != null && !methodParameterComponentTypeName.equals(parameterTypeName) && !methodParameterComponentTypeName.equals(parameterTypeSuperClassName)) { 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 4f8e0efdb..8c43fcb16 100644 --- a/src/test/java/org/apache/commons/lang3/reflect/MethodUtilsTest.java +++ b/src/test/java/org/apache/commons/lang3/reflect/MethodUtilsTest.java @@ -32,6 +32,9 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import java.awt.Color; import java.lang.reflect.Method; import java.lang.reflect.Type; +import java.nio.file.Files; +import java.nio.file.LinkOption; +import java.nio.file.Path; import java.util.Arrays; import java.util.Date; import java.util.HashMap; @@ -597,58 +600,36 @@ public class MethodUtilsTest extends AbstractLangTest { @Test public void testGetMatchingAccessibleMethod() { - expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", - ArrayUtils.EMPTY_CLASS_ARRAY, ArrayUtils.EMPTY_CLASS_ARRAY); - expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", - null, ArrayUtils.EMPTY_CLASS_ARRAY); - expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", - singletonArray(String.class), singletonArray(String.class)); - expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", - singletonArray(Object.class), singletonArray(Object.class)); - expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", - singletonArray(Boolean.class), singletonArray(Object.class)); - expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", - singletonArray(Byte.class), singletonArray(Integer.TYPE)); - expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", - singletonArray(Byte.TYPE), singletonArray(Integer.TYPE)); - expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", - singletonArray(Short.class), singletonArray(Integer.TYPE)); - expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", - singletonArray(Short.TYPE), singletonArray(Integer.TYPE)); - expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", - singletonArray(Character.class), singletonArray(Integer.TYPE)); - expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", - singletonArray(Character.TYPE), singletonArray(Integer.TYPE)); - expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", - singletonArray(Integer.class), singletonArray(Integer.class)); - expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", - singletonArray(Integer.TYPE), singletonArray(Integer.TYPE)); - expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", - singletonArray(Long.class), singletonArray(Long.TYPE)); - expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", - singletonArray(Long.TYPE), singletonArray(Long.TYPE)); - expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", - singletonArray(Float.class), singletonArray(Double.TYPE)); - expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", - singletonArray(Float.TYPE), singletonArray(Double.TYPE)); - expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", - singletonArray(Double.class), singletonArray(Double.TYPE)); - expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", - singletonArray(Double.TYPE), singletonArray(Double.TYPE)); - expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", - singletonArray(Double.TYPE), singletonArray(Double.TYPE)); - expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", - new Class[]{String.class, String.class}, new Class[]{String[].class}); - expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", - new Class[]{Integer.TYPE, String.class, String.class}, new Class[]{Integer.class, String[].class}); - expectMatchingAccessibleMethodParameterTypes(InheritanceBean.class, "testOne", - singletonArray(ParentObject.class), singletonArray(ParentObject.class)); - expectMatchingAccessibleMethodParameterTypes(InheritanceBean.class, "testOne", - singletonArray(ChildObject.class), singletonArray(ParentObject.class)); - expectMatchingAccessibleMethodParameterTypes(InheritanceBean.class, "testTwo", - singletonArray(ParentObject.class), singletonArray(GrandParentObject.class)); - expectMatchingAccessibleMethodParameterTypes(InheritanceBean.class, "testTwo", - singletonArray(ChildObject.class), singletonArray(ChildInterface.class)); + expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", ArrayUtils.EMPTY_CLASS_ARRAY, ArrayUtils.EMPTY_CLASS_ARRAY); + expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", null, ArrayUtils.EMPTY_CLASS_ARRAY); + expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", singletonArray(String.class), singletonArray(String.class)); + expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", singletonArray(Object.class), singletonArray(Object.class)); + expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", singletonArray(Boolean.class), singletonArray(Object.class)); + expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", singletonArray(Byte.class), singletonArray(Integer.TYPE)); + expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", singletonArray(Byte.TYPE), singletonArray(Integer.TYPE)); + expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", singletonArray(Short.class), singletonArray(Integer.TYPE)); + expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", singletonArray(Short.TYPE), singletonArray(Integer.TYPE)); + expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", singletonArray(Character.class), singletonArray(Integer.TYPE)); + expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", singletonArray(Character.TYPE), singletonArray(Integer.TYPE)); + expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", singletonArray(Integer.class), singletonArray(Integer.class)); + expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", singletonArray(Integer.TYPE), singletonArray(Integer.TYPE)); + expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", singletonArray(Long.class), singletonArray(Long.TYPE)); + expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", singletonArray(Long.TYPE), singletonArray(Long.TYPE)); + expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", singletonArray(Float.class), singletonArray(Double.TYPE)); + expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", singletonArray(Float.TYPE), singletonArray(Double.TYPE)); + expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", singletonArray(Double.class), singletonArray(Double.TYPE)); + expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", singletonArray(Double.TYPE), singletonArray(Double.TYPE)); + expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", singletonArray(Double.TYPE), singletonArray(Double.TYPE)); + expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", new Class[] { String.class, String.class }, new Class[] { String[].class }); + expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo", new Class[] { Integer.TYPE, String.class, String.class }, + new Class[] { Integer.class, String[].class }); + expectMatchingAccessibleMethodParameterTypes(InheritanceBean.class, "testOne", singletonArray(ParentObject.class), singletonArray(ParentObject.class)); + expectMatchingAccessibleMethodParameterTypes(InheritanceBean.class, "testOne", singletonArray(ChildObject.class), singletonArray(ParentObject.class)); + expectMatchingAccessibleMethodParameterTypes(InheritanceBean.class, "testTwo", singletonArray(ParentObject.class), + singletonArray(GrandParentObject.class)); + expectMatchingAccessibleMethodParameterTypes(InheritanceBean.class, "testTwo", singletonArray(ChildObject.class), singletonArray(ChildInterface.class)); + // LANG-1757 + expectMatchingAccessibleMethodParameterTypes(Files.class, "exists", singletonArray(Path.class), new Class[] { Path.class, LinkOption[].class }); } @Test