diff --git a/src/changes/changes.xml b/src/changes/changes.xml index cf4296efc..66dd510d0 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -53,6 +53,7 @@ The type attribute can be add,update,fix,remove. ConstructorUtils.invokeConstructor(Class, Object...) regression EqualsBuilder#isRegistered: swappedPair construction bug org.apache.commons.lang3.time.FastDateParser should use toUpperCase(Locale) + Add methods to ObjectUtils to get various forms of class names in a null-safe manner diff --git a/src/main/java/org/apache/commons/lang3/ObjectUtils.java b/src/main/java/org/apache/commons/lang3/ObjectUtils.java index 1ec0956f7..16a6b9312 100644 --- a/src/main/java/org/apache/commons/lang3/ObjectUtils.java +++ b/src/main/java/org/apache/commons/lang3/ObjectUtils.java @@ -1033,4 +1033,36 @@ public static T CONST(final T v) { 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(); + } } diff --git a/src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java b/src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java index 3da844300..2bf036c8c 100644 --- a/src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java +++ b/src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java @@ -38,6 +38,7 @@ import org.apache.commons.lang3.exception.CloneFailedException; import org.apache.commons.lang3.mutable.MutableObject; import org.apache.commons.lang3.text.StrBuilder; +import org.junit.Assert; import org.junit.Test; /** @@ -666,4 +667,36 @@ public int compare(final CharSequence o1, final CharSequence o2) { } } + + /** + * @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"))); + } }