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(), "