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

Reply via email to