我正在尝试这样做,但不起作用:
public static Class loadIt(String name) throws Throwable {
return Class.forName(name);
}
assert foo.loadIt("int") == int.class; // exception here
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?
Boz*_*zho 15
你不能,因为原语不是对象.
你目前正在尝试的是尚未实例化 - 它正在加载一个类.但你不能为原始人做到这一点.int确实是用于int类型的名称,无论何时Class获得它们的对象(例如通过反射method.getReturnType()),但是你无法加载它forName().
参考:反思教程:
如果类的完全限定名称可用,则可以使用静态方法Class.forName()获取相应的Class.这不能用于原始类型
实例化一个原语的解决方案是使用commons-lang ClassUtils,它可以获得与给定原语相对应的包装类:
if (clazz.isPrimitive() {
clazz = ClassUtils.primitiveToWrapper(clazz);
}
clazz.newInstance();
Run Code Online (Sandbox Code Playgroud)
请注意,这假设您具有Class表示int类型 - 通过反射或通过文字(int.class).但是,除了我之外,还有一个字符串表示形式的用法.你可以forName("java.lang.Integer")改用.
我们使用或拥有一个简单的方法(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);
}
}
}
Run Code Online (Sandbox Code Playgroud)