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.
This commit is contained in:
Henry Tung 2016-05-22 18:45:49 -07:00 committed by pascalschumacher
parent e05b50e1da
commit fbb5d31a58
2 changed files with 19 additions and 4 deletions

View File

@ -72,6 +72,22 @@ public enum Interfaces {
*/ */
public static final String INNER_CLASS_SEPARATOR = String.valueOf(INNER_CLASS_SEPARATOR_CHAR); 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<String, Class<?>> namePrimitiveMap = new HashMap<String, Class<?>>();
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}. * Maps primitive {@code Class}es to their corresponding wrapper {@code Class}.
*/ */
@ -125,7 +141,6 @@ public enum Interfaces {
m.put("byte", "B"); m.put("byte", "B");
m.put("double", "D"); m.put("double", "D");
m.put("char", "C"); m.put("char", "C");
m.put("void", "V");
final Map<String, String> r = new HashMap<String, String>(); final Map<String, String> r = new HashMap<String, String>();
for (final Map.Entry<String, String> e : m.entrySet()) { for (final Map.Entry<String, String> e : m.entrySet()) {
r.put(e.getValue(), e.getKey()); 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 { final ClassLoader classLoader, final String className, final boolean initialize) throws ClassNotFoundException {
try { try {
Class<?> clazz; Class<?> clazz;
if (abbreviationMap.containsKey(className)) { if (namePrimitiveMap.containsKey(className)) {
final String clsName = "[" + abbreviationMap.get(className); clazz = namePrimitiveMap.get(className);
clazz = Class.forName(clsName, initialize, classLoader).getComponentType();
} else { } else {
clazz = Class.forName(toCanonicalName(className), initialize, classLoader); clazz = Class.forName(toCanonicalName(className), initialize, classLoader);
} }

View File

@ -1074,6 +1074,7 @@ public void testGetClassRawPrimitives() throws ClassNotFoundException {
assertEquals( float.class, ClassUtils.getClass( "float" ) ); assertEquals( float.class, ClassUtils.getClass( "float" ) );
assertEquals( double.class, ClassUtils.getClass( "double" ) ); assertEquals( double.class, ClassUtils.getClass( "double" ) );
assertEquals( boolean.class, ClassUtils.getClass( "boolean" ) ); assertEquals( boolean.class, ClassUtils.getClass( "boolean" ) );
assertEquals( void.class, ClassUtils.getClass( "void" ) );
} }
private void assertGetClassReturnsClass( final Class<?> c ) throws Exception { private void assertGetClassReturnsClass( final Class<?> c ) throws Exception {