从类对象实例化类

2022-09-02 01:04:30

在java中,我可以使用类对象来动态实例化该类型的类吗?

即,我想要一些这样的功能。

Object foo(Class type) {
    // return new object of type 'type'
}

答案 1

在Java 9及以后,如果有一个声明的零参数(“nullary”)构造函数,你可以使用Class.getDeclaredConstructor()来获取它,然后在它上面调用newInstance():

Object foo(Class type) throws InstantiationException, IllegalAccessException, InvocationTargetException {
    return type.getDeclaredConstructor().newInstance();
}

在Java 9之前,你会使用Class.newInstance

Object foo(Class type) throws InstantiationException, IllegalAccessException {
    return type.newInstance();
}

...但是从Java 9开始,它就被弃用了,因为它抛出了构造函数抛出的任何异常,甚至检查了异常,但(当然)没有声明那些检查的异常,有效地绕过了编译时检查的异常处理。 将构造函数中的异常包装进去。Constructor.newInstanceInvocationTargetException

上述两者都假设存在一个零参数构造函数。一个更健壮的途径是通过Class.getDeclaredConstructorsClass.getConstructors,它引导你使用java.lang.reflect包中的Reflectrum内容,以找到一个构造函数,其参数类型与你打算给它的参数相匹配。


答案 2

用:

type.newInstance()

使用空开销生成器创建实例,或使用方法 type.getConstructor(..) 获取相关构造函数,然后调用它。