[英]Using primitive types with ClassLoader
我有一段代码,用于将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);
}
在我看来,这很讨厌,因此,有什么干净的方法吗?
由于您对此有一个例外: Class.forName(int.class.getName())
,我想这是要走的路。
检查Spring框架代码http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/util/ClassUtils.html类,方法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 .String%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);
}
为了使生活更有趣,您还会遇到数组问题。 这可以解决数组问题:
private Pattern arrayPattern = Pattern.compile("([\\w\\.]*)\\[\\]");
public Class<?> getClassFor(String className) throws ClassNotFoundException {
Matcher m = arrayPattern.matcher(className);
if(m.find()) {
String elementName = m.group(1);
return Class.forName("[L" + elementName + ";"); // see below
}
return Class.forName(className);
}
类名在[L(classname);中的包装; -我在这里采购的。 我看不到一种更清洁的方法,但是我敢肯定必须有一种方法。
当然,原始类型的数组将需要进一步的特殊情况逻辑集。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.