diff --git a/src/main/java/org/apache/commons/lang3/ClassUtils.java b/src/main/java/org/apache/commons/lang3/ClassUtils.java index f1c4c767f..2384c0ea2 100644 --- a/src/main/java/org/apache/commons/lang3/ClassUtils.java +++ b/src/main/java/org/apache/commons/lang3/ClassUtils.java @@ -523,6 +523,37 @@ public static boolean isAssignable(Class[] classArray, Class[] toClassArra return true; } + /** + * Returns whether the given {@code type} is a primitive or primitive wrapper ({@link Boolean}, {@link Byte}, {@link Character}, + * {@link Short}, {@link Integer}, {@link Long}, {@link Double}, {@link Float}). + * + * @param type + * The class to query or null. + * @return true if the given {@code type} is a primitive or primitive wrapper ({@link Boolean}, {@link Byte}, {@link Character}, + * {@link Short}, {@link Integer}, {@link Long}, {@link Double}, {@link Float}). + * @since 3.0.2 + */ + public static boolean isPrimitiveOrWrapper(Class type) { + if (type == null) { + return false; + } + return type.isPrimitive() || isPrimitiveWrapper(type); + } + + /** + * Returns whether the given {@code type} is a primitive wrapper ({@link Boolean}, {@link Byte}, {@link Character}, {@link Short}, + * {@link Integer}, {@link Long}, {@link Double}, {@link Float}). + * + * @param type + * The class to query or null. + * @return true if the given {@code type} is a primitive wrapper ({@link Boolean}, {@link Byte}, {@link Character}, {@link Short}, + * {@link Integer}, {@link Long}, {@link Double}, {@link Float}). + * @since 3.0.2 + */ + public static boolean isPrimitiveWrapper(Class type) { + return wrapperPrimitiveMap.containsKey(type); + } + /** *

Checks if one {@code Class} can be assigned to a variable of * another {@code Class}.

@@ -1100,4 +1131,5 @@ private static String getCanonicalName(String className) { } } } + } diff --git a/src/site/changes/changes.xml b/src/site/changes/changes.xml index 1a1aaa756..9661d26ba 100644 --- a/src/site/changes/changes.xml +++ b/src/site/changes/changes.xml @@ -21,7 +21,8 @@ - + + Add APIs ClassUtils.isPrimitiveWrapper(Class<?>) and isPrimitiveOrWrapper(Class<?>) Fix createLong() so it behaves like createInteger() Include the actual type in the Validate.isInstance and isAssignableFrom exception messages NumberUtils does not handle upper-case hex: 0X and -0X diff --git a/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java b/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java index e95322eaf..5dfa1779e 100644 --- a/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java +++ b/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java @@ -716,6 +716,66 @@ public void test_isAssignable_Unboxing_Widening() throws Exception { assertTrue("boolean -> boolean", ClassUtils.isAssignable(Boolean.class, Boolean.TYPE, true)); } + public void testIsPrimitiveOrWrapper() { + + // test primitive wrapper classes + assertTrue("Boolean.class", ClassUtils.isPrimitiveOrWrapper(Boolean.class)); + assertTrue("Byte.class", ClassUtils.isPrimitiveOrWrapper(Byte.class)); + assertTrue("Character.class", ClassUtils.isPrimitiveOrWrapper(Character.class)); + assertTrue("Short.class", ClassUtils.isPrimitiveOrWrapper(Short.class)); + assertTrue("Integer.class", ClassUtils.isPrimitiveOrWrapper(Integer.class)); + assertTrue("Long.class", ClassUtils.isPrimitiveOrWrapper(Long.class)); + assertTrue("Double.class", ClassUtils.isPrimitiveOrWrapper(Double.class)); + assertTrue("Float.class", ClassUtils.isPrimitiveOrWrapper(Float.class)); + + // test primitive classes + assertTrue("boolean", ClassUtils.isPrimitiveOrWrapper(Boolean.TYPE)); + assertTrue("byte", ClassUtils.isPrimitiveOrWrapper(Byte.TYPE)); + assertTrue("char", ClassUtils.isPrimitiveOrWrapper(Character.TYPE)); + assertTrue("short", ClassUtils.isPrimitiveOrWrapper(Short.TYPE)); + assertTrue("int", ClassUtils.isPrimitiveOrWrapper(Integer.TYPE)); + assertTrue("long", ClassUtils.isPrimitiveOrWrapper(Long.TYPE)); + assertTrue("double", ClassUtils.isPrimitiveOrWrapper(Double.TYPE)); + assertTrue("float", ClassUtils.isPrimitiveOrWrapper(Float.TYPE)); + assertTrue("Void.TYPE", ClassUtils.isPrimitiveOrWrapper(Void.TYPE)); + + // others + assertFalse("null", ClassUtils.isPrimitiveOrWrapper(null)); + assertFalse("Void.class", ClassUtils.isPrimitiveOrWrapper(Void.class)); + assertFalse("String.class", ClassUtils.isPrimitiveOrWrapper(String.class)); + assertFalse("this.getClass()", ClassUtils.isPrimitiveOrWrapper(this.getClass())); + } + + public void testIsPrimitiveWrapper() { + + // test primitive wrapper classes + assertTrue("Boolean.class", ClassUtils.isPrimitiveWrapper(Boolean.class)); + assertTrue("Byte.class", ClassUtils.isPrimitiveWrapper(Byte.class)); + assertTrue("Character.class", ClassUtils.isPrimitiveWrapper(Character.class)); + assertTrue("Short.class", ClassUtils.isPrimitiveWrapper(Short.class)); + assertTrue("Integer.class", ClassUtils.isPrimitiveWrapper(Integer.class)); + assertTrue("Long.class", ClassUtils.isPrimitiveWrapper(Long.class)); + assertTrue("Double.class", ClassUtils.isPrimitiveWrapper(Double.class)); + assertTrue("Float.class", ClassUtils.isPrimitiveWrapper(Float.class)); + + // test primitive classes + assertFalse("boolean", ClassUtils.isPrimitiveWrapper(Boolean.TYPE)); + assertFalse("byte", ClassUtils.isPrimitiveWrapper(Byte.TYPE)); + assertFalse("char", ClassUtils.isPrimitiveWrapper(Character.TYPE)); + assertFalse("short", ClassUtils.isPrimitiveWrapper(Short.TYPE)); + assertFalse("int", ClassUtils.isPrimitiveWrapper(Integer.TYPE)); + assertFalse("long", ClassUtils.isPrimitiveWrapper(Long.TYPE)); + assertFalse("double", ClassUtils.isPrimitiveWrapper(Double.TYPE)); + assertFalse("float", ClassUtils.isPrimitiveWrapper(Float.TYPE)); + + // others + assertFalse("null", ClassUtils.isPrimitiveWrapper(null)); + assertFalse("Void.class", ClassUtils.isPrimitiveWrapper(Void.class)); + assertFalse("Void.TYPE", ClassUtils.isPrimitiveWrapper(Void.TYPE)); + assertFalse("String.class", ClassUtils.isPrimitiveWrapper(String.class)); + assertFalse("this.getClass()", ClassUtils.isPrimitiveWrapper(this.getClass())); + } + public void testPrimitiveToWrapper() { // test primitive classes