我正在尝试这样做,但是不起作用:
public static Class loadIt(String name) throws Throwable { return Class.forName(name); } assert foo.loadIt("int") == int.class; // exception here
我应该如何正确地做到这一点?
您不能,因为基元不是对象。
您目前正在尝试的还没有实例化- 它正在加载一个类。但是您不能对原始对象执行此操作。int确实是用于int类型的名称,无论何时获取其Class对象(例如method.getReturnType(),通过反射),但您都无法使用加载它forName()。
int
Class
method.getReturnType()
forName()
参考:反射教程:
如果一个类的全限定名称可用,则可以使用静态方法Class.forName()获得相应的Class。 不能用于基本类型
实例化原语的一种解决方案是使用commons-lang ClassUtils,它可以获取与给定原语相对应的包装器类:
ClassUtils
if (clazz.isPrimitive() { clazz = ClassUtils.primitiveToWrapper(clazz); } clazz.newInstance();
请注意,这假定您具有Class表示int类型的类型- 通过反射或通过文字(int.class)。但是超出我的范围的是用字符串表示的用例。您可以forName("java.lang.Integer")改用。
int.class
forName("java.lang.Integer")