From fbb5d31a581c24e925c442a7754358d2b62a669d Mon Sep 17 00:00:00 2001 From: Henry Tung Date: Sun, 22 May 2016 18:45:49 -0700 Subject: [PATCH] LANG-1214: Handle "void" in ClassUtils.getClass() (closes #155) getClass() previously deferred to an array type to get the class, but this fails for void, which lacks an array type. Instead, map explicitly from primitive name to primitive class. --- .../org/apache/commons/lang3/ClassUtils.java | 22 +++++++++++++++---- .../apache/commons/lang3/ClassUtilsTest.java | 1 + 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/commons/lang3/ClassUtils.java b/src/main/java/org/apache/commons/lang3/ClassUtils.java index 0a7480ff8..da2a7b2a3 100644 --- a/src/main/java/org/apache/commons/lang3/ClassUtils.java +++ b/src/main/java/org/apache/commons/lang3/ClassUtils.java @@ -72,6 +72,22 @@ public enum Interfaces { */ public static final String INNER_CLASS_SEPARATOR = String.valueOf(INNER_CLASS_SEPARATOR_CHAR); + /** + * Maps names of primitives to their corresponding primitive {@code Class}es. + */ + private static final Map> namePrimitiveMap = new HashMap>(); + static { + namePrimitiveMap.put("boolean", Boolean.TYPE); + namePrimitiveMap.put("byte", Byte.TYPE); + namePrimitiveMap.put("char", Character.TYPE); + namePrimitiveMap.put("short", Short.TYPE); + namePrimitiveMap.put("int", Integer.TYPE); + namePrimitiveMap.put("long", Long.TYPE); + namePrimitiveMap.put("double", Double.TYPE); + namePrimitiveMap.put("float", Float.TYPE); + namePrimitiveMap.put("void", Void.TYPE); + } + /** * Maps primitive {@code Class}es to their corresponding wrapper {@code Class}. */ @@ -125,7 +141,6 @@ public enum Interfaces { m.put("byte", "B"); m.put("double", "D"); m.put("char", "C"); - m.put("void", "V"); final Map r = new HashMap(); for (final Map.Entry e : m.entrySet()) { r.put(e.getValue(), e.getKey()); @@ -902,9 +917,8 @@ public static Class getClass( final ClassLoader classLoader, final String className, final boolean initialize) throws ClassNotFoundException { try { Class clazz; - if (abbreviationMap.containsKey(className)) { - final String clsName = "[" + abbreviationMap.get(className); - clazz = Class.forName(clsName, initialize, classLoader).getComponentType(); + if (namePrimitiveMap.containsKey(className)) { + clazz = namePrimitiveMap.get(className); } else { clazz = Class.forName(toCanonicalName(className), initialize, classLoader); } diff --git a/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java b/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java index 9bd2771d5..44fc96e45 100644 --- a/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java +++ b/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java @@ -1074,6 +1074,7 @@ public void testGetClassRawPrimitives() throws ClassNotFoundException { assertEquals( float.class, ClassUtils.getClass( "float" ) ); assertEquals( double.class, ClassUtils.getClass( "double" ) ); assertEquals( boolean.class, ClassUtils.getClass( "boolean" ) ); + assertEquals( void.class, ClassUtils.getClass( "void" ) ); } private void assertGetClassReturnsClass( final Class c ) throws Exception {