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

garydgregory 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 d215e7fec keep array encoding intact in ClassUtils.getAbbreviatedName 
(#1829)
d215e7fec is described below

commit d215e7fec92fcd4e89f5c834e34636ce7cc37f1e
Author: alhuda <[email protected]>
AuthorDate: Wed Oct 21 03:15:39 2026 +0530

    keep array encoding intact in ClassUtils.getAbbreviatedName (#1829)
    
    getAbbreviatedName(Class, int) abbreviates Class.getName(), and for an
    array class the first '.' segment carries the JVM array encoding, so
    "[Ljava" was shortened to "[" and the 'L' marker was lost:
    String[].class and String[][].class both abbreviated to "[.l.String;".
    
    Keep the leading [...[L prefix and trailing ';' and abbreviate only the
    element class name, the same encoding getPackageName(String) strips.
---
 src/main/java/org/apache/commons/lang3/ClassUtils.java     |  9 +++++++++
 src/test/java/org/apache/commons/lang3/ClassUtilsTest.java | 13 +++++++++++++
 2 files changed, 22 insertions(+)

diff --git a/src/main/java/org/apache/commons/lang3/ClassUtils.java 
b/src/main/java/org/apache/commons/lang3/ClassUtils.java
index 5c6f1bf0d..efd55965d 100644
--- a/src/main/java/org/apache/commons/lang3/ClassUtils.java
+++ b/src/main/java/org/apache/commons/lang3/ClassUtils.java
@@ -338,6 +338,15 @@ public static String getAbbreviatedName(final String 
className, final int length
         if (className.length() <= lengthHint) {
             return className;
         }
+        // Keep the array encoding (for example "[[L" ... ";") intact and only 
abbreviate the element class name
+        int dims = 0;
+        while (dims < className.length() && className.charAt(dims) == '[') {
+            dims++;
+        }
+        if (dims > 0 && className.length() > dims + 2 && 
className.charAt(dims) == 'L' && className.charAt(className.length() - 1) == 
';') {
+            final String elementName = className.substring(dims + 1, 
className.length() - 1);
+            return className.substring(0, dims + 1) + 
getAbbreviatedName(elementName, Math.max(1, lengthHint - dims - 2)) + ';';
+        }
         final char[] abbreviated = className.toCharArray();
         int target = 0;
         int source = 0;
diff --git a/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java 
b/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java
index 436e188bc..032a1b971 100644
--- a/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java
@@ -191,6 +191,19 @@ void test_getAbbreviatedName_Class() {
         assertEquals("java.lang.String", 
ClassUtils.getAbbreviatedName(String.class, 20));
     }
 
+    @Test
+    void test_getAbbreviatedName_Class_Array() {
+        assertEquals("[Lj.l.String;", 
ClassUtils.getAbbreviatedName(String[].class, 1));
+        assertEquals("[[Lj.l.String;", 
ClassUtils.getAbbreviatedName(String[][].class, 1));
+        assertEquals("[Lj.lang.String;", 
ClassUtils.getAbbreviatedName(String[].class, "[Lj.lang.String;".length()));
+        assertEquals("[Lj.l.String;", 
ClassUtils.getAbbreviatedName(String[].class, "[Lj.lang.String;".length() - 1));
+        assertEquals("[Ljava.lang.String;", 
ClassUtils.getAbbreviatedName(String[].class, 30));
+        assertEquals("[Lo.a.c.l.ClassUtils;", 
ClassUtils.getAbbreviatedName(ClassUtils[].class, 21));
+        assertEquals("[I", ClassUtils.getAbbreviatedName(int[].class, 1));
+        assertEquals("[[I", ClassUtils.getAbbreviatedName(int[][].class, 1));
+        assertEquals("[Lj.l.String;", 
ClassUtils.getAbbreviatedName("[Ljava.lang.String;", 1));
+    }
+
     @Test
     /** When the desired length is negative then exception is thrown */
     void test_getAbbreviatedName_Class_NegativeLen() {

Reply via email to