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