将原始类型与ClassLoader一起使用

aRe*_*ess 5 java classloader primitive-types

我有一段代码用于将字符串表示Class.getCanonicalName()转换为相应的实例Class.这通常可以使用ClassLoader.loadClass("className").但是,它在原始类型上失败了ClassNotFoundException.我遇到的唯一解决方案是这样的:

private Class<?> stringToClass(String className) throws ClassNotFoundException {
    if("int".equals(className)) {
        return int.class;
    } else if("short".equals(className)) {
        return short.class;
    } else if("long".equals(className)) {
        return long.class;
    } else if("float".equals(className)) {
        return float.class;
    } else if("double".equals(className)) {
        return double.class;
    } else if("boolean".equals(className)) {
        return boolean.class;
    }
    return ClassLoader.getSystemClassLoader().loadClass(className);
}
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎讨厌,所以有什么干净的办法吗?

Fra*_*eth 4

既然你有一个例外:Class.forName(int.class.getName()),我会说这是要走的路。

检查Spring框架代码http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/util/ClassUtils.html class, method resolvePrimitiveClassName,你会发现它们做了同样的事情,但是有地图;)。源代码:http://grepcode.com/file/repository.springsource.com/org.springframework/org.springframework.core/3.1.0/org/springframework/util/ClassUtils.java#ClassUtils.resolvePrimitiveClassName%28java.lang .字符串%29

像这样的东西:

private static final Map primitiveTypeNameMap = new HashMap(16);
// and populate like this
primitiveTypeNames.addAll(Arrays.asList(new Class[] {
        boolean[].class, byte[].class, char[].class, double[].class,
        float[].class, int[].class, long[].class, short[].class}));
for (Iterator it = primitiveTypeNames.iterator(); it.hasNext();) {
    Class primitiveClass = (Class) it.next();
    primitiveTypeNameMap.put(primitiveClass.getName(), primitiveClass);
}
Run Code Online (Sandbox Code Playgroud)