This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new 7098a3a110 org.apache.juneau.common.reflect API improvements
7098a3a110 is described below

commit 7098a3a1101bca2efa4128019563666cc015f22f
Author: James Bognar <[email protected]>
AuthorDate: Tue Nov 18 09:39:59 2025 -0500

    org.apache.juneau.common.reflect API improvements
---
 .../juneau/common/reflect/ReflectionMap.java       | 48 ++++++++++++++--------
 .../juneau/common/reflect/ReflectionMap_Test.java  | 34 +++++++++++++++
 2 files changed, 64 insertions(+), 18 deletions(-)

diff --git 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ReflectionMap.java
 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ReflectionMap.java
index 591b4b074a..21a93795fb 100644
--- 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ReflectionMap.java
+++ 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ReflectionMap.java
@@ -404,25 +404,10 @@ public class ReflectionMap<V> {
                        this.args = i == -1 ? null : 
splitMethodArgs(name.substring(i + 1, name.length() - 1));
                        if (nn(args)) {
                                for (int j = 0; j < args.length; j++) {
-
                                        // Strip off generic parameters.
                                        int k = args[j].indexOf('<');
                                        if (k > 0)
                                                args[j] = args[j].substring(0, 
k);
-
-                                       // Convert from xxx[][] to [[Lxxx; 
notation.
-                                       if (args[j].endsWith("[]")) {
-                                               int l = 0;
-                                               while (args[j].endsWith("[]")) {
-                                                       l++;
-                                                       args[j] = 
args[j].substring(0, args[j].length() - 2);
-                                               }
-                                               var sb = new 
StringBuilder(args[j].length() + l + 2);
-                                               for (int m = 0; m < l; m++)
-                                                       sb.append('[');
-                                               
sb.append('L').append(args[j]).append(';');
-                                               args[j] = sb.toString();
-                                       }
                                }
                        }
                        name = i == -1 ? name : name.substring(0, i);
@@ -488,14 +473,41 @@ public class ReflectionMap<V> {
                if (names.length != args.length)
                        return false;
                for (int i = 0; i < args.length; i++) {
-                       var n = names[i];
-                       var a = args[i];
-                       if (! (eq(n, a.getSimpleName()) || eq(n, a.getName())))
+                       if (!argMatches(names[i], args[i]))
                                return false;
                }
                return true;
        }
 
+       private static boolean argMatches(String pattern, Class<?> type) {
+               // Extract base type and dimensions from pattern
+               var patternDims = 0;
+               var patternBase = pattern;
+               while (patternBase.endsWith("[]")) {
+                       patternDims++;
+                       patternBase = patternBase.substring(0, 
patternBase.length() - 2);
+               }
+
+               // Extract base type and dimensions from actual type
+               var typeDims = 0;
+               var typeBase = type;
+               while (typeBase.isArray()) {
+                       typeDims++;
+                       typeBase = typeBase.getComponentType();
+               }
+
+               // Array dimensions must match
+               if (patternDims != typeDims)
+                       return false;
+
+               // If non-array, use simple comparison
+               if (patternDims == 0)
+                       return eq(pattern, type.getSimpleName()) || eq(pattern, 
type.getName());
+
+               // For arrays, compare the component types (simple name or full 
name)
+               return eq(patternBase, typeBase.getSimpleName()) || 
eq(patternBase, typeBase.getName());
+       }
+
        private static boolean classMatches(String simpleName, String fullName, 
Class<?> c) {
                // For class 
org.apache.juneau.a.rttests.RountTripBeansWithBuilders$Ac$Builder
                // c.getSimpleName() == "Builder"
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ReflectionMap_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ReflectionMap_Test.java
index e40d6e8b94..ed04d35464 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ReflectionMap_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ReflectionMap_Test.java
@@ -191,6 +191,40 @@ class ReflectionMap_Test extends TestBase {
                        test(B2.class.getMethod("m1"), false, false, false, 
false, false, false, false, false, false, false, false, false);
                        test(null, false, false, false, false, false, false, 
false, false, false, false, false, false);
                }
+       
+               // Test for generic parameters in method signatures (lines 
409-411)
+               @Test void a03_generics() throws Exception {
+                       ReflectionMap<Number> rm = 
create().append("B1.m1(List<String>)", 1).build();
+                       // Generic parameters should be stripped, so this 
should match m1(List)
+                       // Note: We can't easily test this because Java doesn't 
preserve generic info at runtime,
+                       // but we can verify the pattern was parsed without 
error
+                       assertEquals(1, rm.methodEntries.size());
+               }
+       
+               // Test for array parameters in method signatures (lines 
414-424)
+               static class B3 {
+                       public void m1(String[] x) { /* no-op */ }
+                       public void m2(String[][] x) { /* no-op */ }
+                       public void m3(int[] x) { /* no-op */ }
+               }
+       
+               @Test void a04_arrayParams() throws Exception {
+                       // Single-dimensional array with simple name
+                       ReflectionMap<Number> rm1 = 
create().append("B3.m1(String[])", 1).build();
+                       assertTrue(rm1.find(B3.class.getMethod("m1", 
String[].class)).findAny().isPresent());
+       
+                       // Single-dimensional array with full name
+                       ReflectionMap<Number> rm1b = 
create().append("B3.m1(java.lang.String[])", 1).build();
+                       assertTrue(rm1b.find(B3.class.getMethod("m1", 
String[].class)).findAny().isPresent());
+       
+                       // Multi-dimensional array
+                       ReflectionMap<Number> rm2 = 
create().append("B3.m2(String[][])", 2).build();
+                       assertTrue(rm2.find(B3.class.getMethod("m2", 
String[][].class)).findAny().isPresent());
+       
+                       // Primitive array
+                       ReflectionMap<Number> rm3 = 
create().append("B3.m3(int[])", 3).build();
+                       assertTrue(rm3.find(B3.class.getMethod("m3", 
int[].class)).findAny().isPresent());
+               }
        }
 
        
//------------------------------------------------------------------------------------------------------------------

Reply via email to