Repository: commons-lang Updated Branches: refs/heads/master 125cfb4ca -> 8e8e78d84
[LANG-1360] Add methods to ClassUtils to get various forms of class names in a null-safe manner Project: http://git-wip-us.apache.org/repos/asf/commons-lang/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-lang/commit/8e8e78d8 Tree: http://git-wip-us.apache.org/repos/asf/commons-lang/tree/8e8e78d8 Diff: http://git-wip-us.apache.org/repos/asf/commons-lang/diff/8e8e78d8 Branch: refs/heads/master Commit: 8e8e78d849825696237b9f540f3e082a44b1e838 Parents: 125cfb4 Author: Gary Gregory <ggreg...@apache.org> Authored: Mon Oct 23 10:56:09 2017 -0600 Committer: Gary Gregory <ggreg...@apache.org> Committed: Mon Oct 23 10:56:09 2017 -0600 ---------------------------------------------------------------------- .../org/apache/commons/lang3/ClassUtils.java | 140 +++++++++++++++++-- .../org/apache/commons/lang3/ObjectUtils.java | 32 ----- .../apache/commons/lang3/ClassUtilsTest.java | 59 +++++++- .../apache/commons/lang3/ObjectUtilsTest.java | 31 ---- 4 files changed, 180 insertions(+), 82 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-lang/blob/8e8e78d8/src/main/java/org/apache/commons/lang3/ClassUtils.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/lang3/ClassUtils.java b/src/main/java/org/apache/commons/lang3/ClassUtils.java index c294f67..c81ac3c 100644 --- a/src/main/java/org/apache/commons/lang3/ClassUtils.java +++ b/src/main/java/org/apache/commons/lang3/ClassUtils.java @@ -44,6 +44,7 @@ import org.apache.commons.lang3.mutable.MutableObject; * @since 2.0 */ public class ClassUtils { + /** * Inclusivity literals for {@link #hierarchy(Class, Interfaces)}. * @since 3.2 @@ -242,32 +243,101 @@ public class ClassUtils { /** * <p>Null-safe version of <code>aClass.getSimpleName()</code></p> * - * @param cls the class for which to get the simple name. + * @param cls the class for which to get the simple name; may be null * @return the simple class name. * @since 3.0 * @see Class#getSimpleName() */ public static String getSimpleName(final Class<?> cls) { - if (cls == null) { - return StringUtils.EMPTY; - } - return cls.getSimpleName(); + return getSimpleName(cls, StringUtils.EMPTY); + } + + /** + * <p>Null-safe version of <code>aClass.getSimpleName()</code></p> + * + * @param cls the class for which to get the simple name; may be null + * @param valueIfNull the value to return if null + * @return the simple class name or {@code valueIfNull} + * @since 3.0 + * @see Class#getSimpleName() + */ + public static String getSimpleName(final Class<?> cls, String valueIfNull) { + return cls == null ? valueIfNull : cls.getSimpleName(); } /** * <p>Null-safe version of <code>aClass.getSimpleName()</code></p> * - * @param object the object for which to get the simple class name. + * @param object the object for which to get the simple class name; may be null + * @return the simple class name or the empty String + * @since 3.7 + * @see Class#getSimpleName() + */ + public static String getSimpleName(final Object object) { + return getSimpleName(object, StringUtils.EMPTY); + } + + /** + * <p>Null-safe version of <code>aClass.getSimpleName()</code></p> + * + * @param object the object for which to get the simple class name; may be null * @param valueIfNull the value to return if <code>object</code> is <code>null</code> - * @return the simple class name. + * @return the simple class name or {@code valueIfNull} * @since 3.0 * @see Class#getSimpleName() */ public static String getSimpleName(final Object object, final String valueIfNull) { - if (object == null) { - return valueIfNull; - } - return getSimpleName(object.getClass()); + return object == null ? valueIfNull : object.getClass().getSimpleName(); + } + + /** + * <p>Null-safe version of <code>Class.getName()</code></p> + * + * @param cls the class for which to get the class name; may be null + * @return the class name or the empty String. + * @since 3.7 + * @see Class#getSimpleName() + */ + public static String getName(final Class<?> cls) { + return getName(cls, StringUtils.EMPTY); + } + + /** + * <p>Null-safe version of <code>aClass.getName()</code></p> + * + * @param cls the class for which to get the class name; may be null + * @param valueIfNull the return value if <code>cls</code> is <code>null</code> + * @return the class name or {@code valueIfNull} + * @since 3.7 + * @see Class#getName() + */ + public static String getName(final Class<?> cls, final String valueIfNull) { + return cls == null ? valueIfNull : cls.getName(); + } + + /** + * <p>Null-safe version of <code>Class.getName()</code></p> + * + * @param object the object for which to get the class name; may be null + * @return the class name or the empty String + * @since 3.7 + * @see Class#getSimpleName() + */ + public static String getName(final Object object) { + return getName(object, StringUtils.EMPTY); + } + + /** + * <p>Null-safe version of <code>aClass.getSimpleName()</code></p> + * + * @param object the object for which to get the class name; may be null + * @param valueIfNull the value to return if <code>object</code> is <code>null</code> + * @return the class name or {@code valueIfNull} + * @since 3.0 + * @see Class#getName() + */ + public static String getName(final Object object, final String valueIfNull) { + return object == null ? valueIfNull : object.getClass().getName(); } // Package name @@ -1112,9 +1182,55 @@ public class ClassUtils { } /** + * <p>Gets the canonical class name for a {@code Class}.</p> + * + * @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 + * @since 3.7 + */ + public static String getCanonicalName(final Class<?> cls) { + return getCanonicalName(cls, StringUtils.EMPTY); + } + + /** + * <p>Gets the canonical name for a {@code Class}.</p> + * + * @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} + * @since 3.7 + */ + public static String getCanonicalName(final Class<?> cls, final String valueIfNull) { + return cls == null ? valueIfNull : cls.getClass().getCanonicalName(); + } + + /** + * <p>Gets the canonical name for an {@code Object}.</p> + * + * @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 + */ + public static String getCanonicalName(final Object object) { + return getCanonicalName(object, StringUtils.EMPTY); + } + + /** + * <p>Gets the canonical name for an {@code Object}.</p> + * + * @param object the object for which to get the canonical class name; may be null + * @param valueIfNull the return value if null + * @return the canonical name of the object or {@code valueIfNull} + * @since 3.7 + */ + public static String getCanonicalName(final Object object, final String valueIfNull) { + return object == null ? valueIfNull : object.getClass().getCanonicalName(); + } + + /** * <p>Gets the canonical name minus the package name from a {@code Class}.</p> * - * @param cls the class to get the short name for. + * @param cls the class for which to get the short canonical class name; may be null * @return the canonical name without the package name or an empty string * @since 2.4 */ http://git-wip-us.apache.org/repos/asf/commons-lang/blob/8e8e78d8/src/main/java/org/apache/commons/lang3/ObjectUtils.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/lang3/ObjectUtils.java b/src/main/java/org/apache/commons/lang3/ObjectUtils.java index 8bebba9..1ec0956 100644 --- a/src/main/java/org/apache/commons/lang3/ObjectUtils.java +++ b/src/main/java/org/apache/commons/lang3/ObjectUtils.java @@ -1033,36 +1033,4 @@ public class ObjectUtils { return v; } - /** - * Gets the class name of the given object. - * - * @param object the object to query, may be null - * @return the given object's class name or null if the object is null - * @since 3.7 - */ - public static String getClassName(final Object object) { - return object == null ? null : object.getClass().getName(); - } - - /** - * Gets the class simple name of the given object. - * - * @param object the object to query, may be null - * @return the given object's class simple name or null if the object is null - * @since 3.7 - */ - public static String getClassSimpleName(final Object object) { - return object == null ? null : object.getClass().getSimpleName(); - } - - /** - * Gets the class canonical name of the given object. - * - * @param object the object to query, may be null - * @return the given object's class canonical name or null if the object is null - * @since 3.7 - */ - public static String getClassCanonicalName(final Object object) { - return object == null ? null : object.getClass().getCanonicalName(); - } } http://git-wip-us.apache.org/repos/asf/commons-lang/blob/8e8e78d8/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java b/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java index 9290902..4ae2294 100644 --- a/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java +++ b/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java @@ -343,10 +343,10 @@ public class ClassUtilsTest { class Named { // empty } - assertEquals("ClassUtilsTest.7", ClassUtils.getShortCanonicalName(new Object() { + assertEquals("ClassUtilsTest.4", ClassUtils.getShortCanonicalName(new Object() { // empty }.getClass())); - assertEquals("ClassUtilsTest.6Named", ClassUtils.getShortCanonicalName(Named.class)); + assertEquals("ClassUtilsTest.4Named", ClassUtils.getShortCanonicalName(Named.class)); assertEquals("ClassUtilsTest.Inner", ClassUtils.getShortCanonicalName(Inner.class)); } @@ -363,7 +363,7 @@ public class ClassUtilsTest { class Named { // empty } - assertEquals("ClassUtilsTest.6", ClassUtils.getShortCanonicalName(new Object() { + assertEquals("ClassUtilsTest.5", ClassUtils.getShortCanonicalName(new Object() { // empty }, "<null>")); assertEquals("ClassUtilsTest.5Named", ClassUtils.getShortCanonicalName(new Named(), "<null>")); @@ -427,13 +427,58 @@ public class ClassUtilsTest { class Named { // empty } - assertEquals("ClassUtilsTest.2", ClassUtils.getShortClassName(new Object() { + assertEquals("ClassUtilsTest.6", ClassUtils.getShortClassName(new Object() { // empty }.getClass())); - assertEquals("ClassUtilsTest.2Named", ClassUtils.getShortClassName(Named.class)); + assertEquals("ClassUtilsTest.6Named", 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() { @@ -446,10 +491,10 @@ public class ClassUtilsTest { class Named { // empty } - assertEquals("ClassUtilsTest.1", ClassUtils.getShortClassName(new Object() { + assertEquals("ClassUtilsTest.8", ClassUtils.getShortClassName(new Object() { // empty }, "<null>")); - assertEquals("ClassUtilsTest.1Named", ClassUtils.getShortClassName(new Named(), "<null>")); + assertEquals("ClassUtilsTest.8Named", ClassUtils.getShortClassName(new Named(), "<null>")); assertEquals("ClassUtilsTest.Inner", ClassUtils.getShortClassName(new Inner(), "<null>")); } http://git-wip-us.apache.org/repos/asf/commons-lang/blob/8e8e78d8/src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java b/src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java index 2bf036c..e48fd0d 100644 --- a/src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java +++ b/src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java @@ -668,35 +668,4 @@ public class ObjectUtilsTest { } - /** - * @since 3.7 - */ - @Test - public void testGetClassName() { - Assert.assertNull(ObjectUtils.getClassName(null)); - Assert.assertEquals("java.lang.String", ObjectUtils.getClassName(new String())); - Assert.assertEquals("org.apache.commons.lang3.ObjectUtilsTest$CloneableString", - ObjectUtils.getClassName(new CloneableString("test"))); - } - - /** - * @since 3.7 - */ - @Test - public void testGetSimpleName() { - Assert.assertNull(ObjectUtils.getClassSimpleName(null)); - Assert.assertEquals("String", ObjectUtils.getClassSimpleName(new String())); - Assert.assertEquals("CloneableString", ObjectUtils.getClassSimpleName(new CloneableString("test"))); - } - - /** - * @since 3.7 - */ - @Test - public void testGetCanonicalName() { - Assert.assertNull(ObjectUtils.getClassCanonicalName(null)); - Assert.assertEquals("java.lang.String", ObjectUtils.getClassCanonicalName(new String())); - Assert.assertEquals("org.apache.commons.lang3.ObjectUtilsTest.CloneableString", - ObjectUtils.getClassCanonicalName(new CloneableString("test"))); - } }