diff --git a/src/main/java/org/apache/commons/lang3/ClassUtils.java b/src/main/java/org/apache/commons/lang3/ClassUtils.java index c81ac3ce5..1cbdd1931 100644 --- a/src/main/java/org/apache/commons/lang3/ClassUtils.java +++ b/src/main/java/org/apache/commons/lang3/ClassUtils.java @@ -1185,8 +1185,9 @@ public static String getShortCanonicalName(final Object object, final String val *

Gets the canonical class name for a {@code Class}.

* * @param cls the class for which to get the canonical class name; may be null - * @return the canonical name of the class or the empty String + * @return the canonical name of the class, or the empty String * @since 3.7 + * @see Class#getCanonicalName() */ public static String getCanonicalName(final Class cls) { return getCanonicalName(cls, StringUtils.EMPTY); @@ -1197,11 +1198,16 @@ public static String getCanonicalName(final Class cls) { * * @param cls the class for which to get the canonical class name; may be null * @param valueIfNull the return value if null - * @return the canonical name of the class or {@code valueIfNull} + * @return the canonical name of the class, or {@code valueIfNull} * @since 3.7 + * @see Class#getCanonicalName() */ public static String getCanonicalName(final Class cls, final String valueIfNull) { - return cls == null ? valueIfNull : cls.getClass().getCanonicalName(); + if (cls == null) { + return valueIfNull; + } + final String canonicalName = cls.getCanonicalName(); + return canonicalName == null ? valueIfNull : canonicalName; } /** @@ -1210,6 +1216,7 @@ public static String getCanonicalName(final Class cls, final String valueIfNu * @param object the object for which to get the canonical class name; may be null * @return the canonical name of the object, or the empty String * @since 3.7 + * @see Class#getCanonicalName() */ public static String getCanonicalName(final Object object) { return getCanonicalName(object, StringUtils.EMPTY); @@ -1222,9 +1229,14 @@ public static String getCanonicalName(final Object object) { * @param valueIfNull the return value if null * @return the canonical name of the object or {@code valueIfNull} * @since 3.7 + * @see Class#getCanonicalName() */ public static String getCanonicalName(final Object object, final String valueIfNull) { - return object == null ? valueIfNull : object.getClass().getCanonicalName(); + if (object == null) { + return valueIfNull; + } + final String canonicalName = object.getClass().getCanonicalName(); + return canonicalName == null ? valueIfNull : canonicalName; } /** diff --git a/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java b/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java index 4ae22944f..6009a68f6 100644 --- a/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java +++ b/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java @@ -219,6 +219,114 @@ public void test_getAllSuperclasses_Class() { assertNull(ClassUtils.getAllSuperclasses(null)); } + @Test + public void test_getCanonicalName_Class() { + assertEquals("org.apache.commons.lang3.ClassUtils", ClassUtils.getCanonicalName(ClassUtils.class)); + assertEquals("java.util.Map.Entry", ClassUtils.getCanonicalName(Map.Entry.class)); + assertEquals("", ClassUtils.getCanonicalName((Class) null)); + + assertEquals("java.lang.String[]", ClassUtils.getCanonicalName(String[].class)); + assertEquals("java.util.Map.Entry[]", ClassUtils.getCanonicalName(Map.Entry[].class)); + + // Primitives + assertEquals("boolean", ClassUtils.getCanonicalName(boolean.class)); + assertEquals("byte", ClassUtils.getCanonicalName(byte.class)); + assertEquals("char", ClassUtils.getCanonicalName(char.class)); + assertEquals("short", ClassUtils.getCanonicalName(short.class)); + assertEquals("int", ClassUtils.getCanonicalName(int.class)); + assertEquals("long", ClassUtils.getCanonicalName(long.class)); + assertEquals("float", ClassUtils.getCanonicalName(float.class)); + assertEquals("double", ClassUtils.getCanonicalName(double.class)); + + // Primitive Arrays + assertEquals("boolean[]", ClassUtils.getCanonicalName(boolean[].class)); + assertEquals("byte[]", ClassUtils.getCanonicalName(byte[].class)); + assertEquals("char[]", ClassUtils.getCanonicalName(char[].class)); + assertEquals("short[]", ClassUtils.getCanonicalName(short[].class)); + assertEquals("int[]", ClassUtils.getCanonicalName(int[].class)); + assertEquals("long[]", ClassUtils.getCanonicalName(long[].class)); + assertEquals("float[]", ClassUtils.getCanonicalName(float[].class)); + assertEquals("double[]", ClassUtils.getCanonicalName(double[].class)); + + // Arrays of arrays of ... + assertEquals("java.lang.String[][]", ClassUtils.getCanonicalName(String[][].class)); + assertEquals("java.lang.String[][][]", ClassUtils.getCanonicalName(String[][][].class)); + assertEquals("java.lang.String[][][][]", ClassUtils.getCanonicalName(String[][][][].class)); + + // Inner types + class Named { + // empty + } + assertEquals(StringUtils.EMPTY, ClassUtils.getCanonicalName(new Object() { + // empty + }.getClass())); + assertEquals(StringUtils.EMPTY, ClassUtils.getCanonicalName(Named.class)); + assertEquals("org.apache.commons.lang3.ClassUtilsTest.Inner", ClassUtils.getCanonicalName(Inner.class)); + } + + @Test + public void test_getName_Class() { + assertEquals("org.apache.commons.lang3.ClassUtils", ClassUtils.getName(ClassUtils.class)); + assertEquals("java.util.Map$Entry", ClassUtils.getName(Map.Entry.class)); + assertEquals("", ClassUtils.getName((Class) null)); + + assertEquals("[Ljava.lang.String;", ClassUtils.getName(String[].class)); + assertEquals("[Ljava.util.Map$Entry;", ClassUtils.getName(Map.Entry[].class)); + + // Primitives + assertEquals("boolean", ClassUtils.getName(boolean.class)); + assertEquals("byte", ClassUtils.getName(byte.class)); + assertEquals("char", ClassUtils.getName(char.class)); + assertEquals("short", ClassUtils.getName(short.class)); + assertEquals("int", ClassUtils.getName(int.class)); + assertEquals("long", ClassUtils.getName(long.class)); + assertEquals("float", ClassUtils.getName(float.class)); + assertEquals("double", ClassUtils.getName(double.class)); + + // Primitive Arrays + assertEquals("[Z", ClassUtils.getName(boolean[].class)); + assertEquals("[B", ClassUtils.getName(byte[].class)); + assertEquals("[C", ClassUtils.getName(char[].class)); + assertEquals("[S", ClassUtils.getName(short[].class)); + assertEquals("[I", ClassUtils.getName(int[].class)); + assertEquals("[J", ClassUtils.getName(long[].class)); + assertEquals("[F", ClassUtils.getName(float[].class)); + assertEquals("[D", ClassUtils.getName(double[].class)); + + // Arrays of arrays of ... + assertEquals("[[Ljava.lang.String;", ClassUtils.getName(String[][].class)); + assertEquals("[[[Ljava.lang.String;", ClassUtils.getName(String[][][].class)); + assertEquals("[[[[Ljava.lang.String;", ClassUtils.getName(String[][][][].class)); + + // Inner types + class Named { + // empty + } + assertEquals("org.apache.commons.lang3.ClassUtilsTest$2", ClassUtils.getName(new Object() { + // empty + }.getClass())); + assertEquals("org.apache.commons.lang3.ClassUtilsTest$2Named", ClassUtils.getName(Named.class)); + assertEquals("org.apache.commons.lang3.ClassUtilsTest$Inner", ClassUtils.getName(Inner.class)); + } + + @Test + public void test_getName_Object() { + assertEquals("org.apache.commons.lang3.ClassUtils", ClassUtils.getName(new ClassUtils(), "")); + assertEquals("org.apache.commons.lang3.ClassUtilsTest$Inner", ClassUtils.getName(new Inner(), "")); + assertEquals("java.lang.String", ClassUtils.getName("hello", "")); + assertEquals("", ClassUtils.getName(null, "")); + + // Inner types + class Named { + // empty + } + assertEquals("org.apache.commons.lang3.ClassUtilsTest$3", ClassUtils.getName(new Object() { + // empty + }, "")); + assertEquals("org.apache.commons.lang3.ClassUtilsTest$3Named", ClassUtils.getName(new Named(), "")); + assertEquals("org.apache.commons.lang3.ClassUtilsTest$Inner", ClassUtils.getName(new Inner(), "")); + } + @Test public void test_getPackageCanonicalName_Class() { assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(ClassUtils.class)); @@ -237,7 +345,7 @@ class Named { assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(Named.class)); assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(Inner.class)); } - + @Test public void test_getPackageCanonicalName_Object() { assertEquals("", ClassUtils.getPackageCanonicalName(null, "")); @@ -257,7 +365,7 @@ class Named { assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(new Named(), "")); assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(new Inner(), "")); } - + @Test public void test_getPackageCanonicalName_String() { assertEquals("org.apache.commons.lang3", @@ -343,10 +451,10 @@ public void test_getShortCanonicalName_Class() { class Named { // empty } - assertEquals("ClassUtilsTest.4", ClassUtils.getShortCanonicalName(new Object() { + assertEquals("ClassUtilsTest.7", ClassUtils.getShortCanonicalName(new Object() { // empty }.getClass())); - assertEquals("ClassUtilsTest.4Named", ClassUtils.getShortCanonicalName(Named.class)); + assertEquals("ClassUtilsTest.7Named", ClassUtils.getShortCanonicalName(Named.class)); assertEquals("ClassUtilsTest.Inner", ClassUtils.getShortCanonicalName(Inner.class)); } @@ -363,10 +471,10 @@ public void test_getShortCanonicalName_Object() { class Named { // empty } - assertEquals("ClassUtilsTest.5", ClassUtils.getShortCanonicalName(new Object() { + assertEquals("ClassUtilsTest.8", ClassUtils.getShortCanonicalName(new Object() { // empty }, "")); - assertEquals("ClassUtilsTest.5Named", ClassUtils.getShortCanonicalName(new Named(), "")); + assertEquals("ClassUtilsTest.8Named", ClassUtils.getShortCanonicalName(new Named(), "")); assertEquals("ClassUtilsTest.Inner", ClassUtils.getShortCanonicalName(new Inner(), "")); } @@ -427,58 +535,13 @@ public void test_getShortClassName_Class() { class Named { // empty } - assertEquals("ClassUtilsTest.6", ClassUtils.getShortClassName(new Object() { + assertEquals("ClassUtilsTest.9", ClassUtils.getShortClassName(new Object() { // empty }.getClass())); - assertEquals("ClassUtilsTest.6Named", ClassUtils.getShortClassName(Named.class)); + assertEquals("ClassUtilsTest.9Named", ClassUtils.getShortClassName(Named.class)); assertEquals("ClassUtilsTest.Inner", ClassUtils.getShortClassName(Inner.class)); } - @Test - public void test_getClassName_Class() { - assertEquals("org.apache.commons.lang3.ClassUtils", ClassUtils.getName(ClassUtils.class)); - assertEquals("java.util.Map$Entry", ClassUtils.getName(Map.Entry.class)); - assertEquals("", ClassUtils.getName((Class) null)); - - assertEquals("[Ljava.lang.String;", ClassUtils.getName(String[].class)); - assertEquals("[Ljava.util.Map$Entry;", ClassUtils.getName(Map.Entry[].class)); - - // Primitives - assertEquals("boolean", ClassUtils.getName(boolean.class)); - assertEquals("byte", ClassUtils.getName(byte.class)); - assertEquals("char", ClassUtils.getName(char.class)); - assertEquals("short", ClassUtils.getName(short.class)); - assertEquals("int", ClassUtils.getName(int.class)); - assertEquals("long", ClassUtils.getName(long.class)); - assertEquals("float", ClassUtils.getName(float.class)); - assertEquals("double", ClassUtils.getName(double.class)); - - // Primitive Arrays - assertEquals("[Z", ClassUtils.getName(boolean[].class)); - assertEquals("[B", ClassUtils.getName(byte[].class)); - assertEquals("[C", ClassUtils.getName(char[].class)); - assertEquals("[S", ClassUtils.getName(short[].class)); - assertEquals("[I", ClassUtils.getName(int[].class)); - assertEquals("[J", ClassUtils.getName(long[].class)); - assertEquals("[F", ClassUtils.getName(float[].class)); - assertEquals("[D", ClassUtils.getName(double[].class)); - - // Arrays of arrays of ... - assertEquals("[[Ljava.lang.String;", ClassUtils.getName(String[][].class)); - assertEquals("[[[Ljava.lang.String;", ClassUtils.getName(String[][][].class)); - assertEquals("[[[[Ljava.lang.String;", ClassUtils.getName(String[][][][].class)); - - // Inner types - class Named { - // empty - } - assertEquals("org.apache.commons.lang3.ClassUtilsTest$7", ClassUtils.getName(new Object() { - // empty - }.getClass())); - assertEquals("org.apache.commons.lang3.ClassUtilsTest$7Named", ClassUtils.getName(Named.class)); - assertEquals("org.apache.commons.lang3.ClassUtilsTest$Inner", ClassUtils.getName(Inner.class)); - } - // ------------------------------------------------------------------------- @Test public void test_getShortClassName_Object() { @@ -491,10 +554,10 @@ public void test_getShortClassName_Object() { class Named { // empty } - assertEquals("ClassUtilsTest.8", ClassUtils.getShortClassName(new Object() { + assertEquals("ClassUtilsTest.10", ClassUtils.getShortClassName(new Object() { // empty }, "")); - assertEquals("ClassUtilsTest.8Named", ClassUtils.getShortClassName(new Named(), "")); + assertEquals("ClassUtilsTest.10Named", ClassUtils.getShortClassName(new Named(), "")); assertEquals("ClassUtilsTest.Inner", ClassUtils.getShortClassName(new Inner(), "")); }