我正在尝试这样做,但不起作用:
public static Class loadIt(String name) throws Throwable {
return Class.forName(name);
}
assert foo.loadIt("int") == int.class; // exception here
我该如何正确地做到这一点?
答案 0 :(得分:14)
你不能,因为原语不是对象。
您目前正在尝试的是尚未实例化 - 它正在加载一个类。但你不能为原始人做到这一点。 int
确实是用于int
类型的名称,只要获得Class
个对象(通过反射,例如method.getReturnType()
),但您无法加载它与forName()
。
如果类的完全限定名称可用,则可以使用静态方法Class.forName()获取相应的Class。 这不能用于原始类型
实例化基元的解决方案是使用commons-lang ClassUtils
,它可以获得与给定基元对应的包装类:
if (clazz.isPrimitive() {
clazz = ClassUtils.primitiveToWrapper(clazz);
}
clazz.newInstance();
请注意,这假设您有Class
表示int类型 - 通过反射或通过文字(int.class
)。但是,除了我之外,还有一个字符串表示形式的用法。您可以改为使用forName("java.lang.Integer")
。
答案 1 :(得分:3)
We use or own simple method (Java 7+):
/**
* Return the java {@link java.lang.Class} object with the specified class name.
*
* This is an "extended" {@link java.lang.Class#forName(java.lang.String) } operation.
*
* + It is able to return Class objects for primitive types
* + Classes in name space `java.lang` do not need the fully qualified name
* + It does not throw a checked Exception
*
* @param className The class name, never `null`
*
* @throws IllegalArgumentException if no class can be loaded
*/
public static Class<?> parseType(final String className) {
switch (className) {
case "boolean":
return boolean.class;
case "byte":
return byte.class;
case "short":
return short.class;
case "int":
return int.class;
case "long":
return long.class;
case "float":
return float.class;
case "double":
return double.class;
case "char":
return char.class;
case "void":
return void.class;
default:
String fqn = className.contains(".") ? className : "java.lang.".concat(className);
try {
return Class.forName(fqn);
} catch (ClassNotFoundException ex) {
throw new IllegalArgumentException("Class not found: " + fqn);
}
}
}
答案 2 :(得分:2)
在这种情况下,您可以期望的最好的方法是创建一个原始地图到其Autoboxed等效项并返回该类型的类。
答案 3 :(得分:1)
尝试像这样的ApacheCommons ClassUtils:
ClassUtils.getClass(className)
很好地适用于原语。
该类的全名是org.apache.commons.lang3.ClassUtils