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());
+ }
}
//------------------------------------------------------------------------------------------------------------------