有这样的要求,我在运行时从特定包获取类名称。我事先不知道类(class)
List<Class<?>> classes = PlayGround.find("MyOwn.newpackage");
现在我需要为上面列表中的每个类实例化一个新对象,并将其添加为另一个类(例如类模型)中的成员
for (int i=0;i<classes.size();i++){
Class tmp = classes.get(i);
}
是否可以从上面的 tmp 类创建一个对象,并将其添加为 Java 中实时类模型的成员变量?
不太干净的方法是编辑 .java 文件流,但想知道我可以从程序本身做到这一点。
最佳答案
您想使用Constructor#newInstance(Object...)
。这比 Class#newInstance 更可取,因为后者将传播无参数构造函数抛出的任何异常,即使它是经过检查的异常。这意味着您不会对已检查异常进行任何编译时类型检查。相比之下,Constructor#newInstance
将抛出一个 InitationTargetException
,它包装了构造函数抛出的已检查异常。
因此,您想要执行以下操作(为简洁起见,省略了异常处理):
Constructor<?> constructor = tmp.getConstructor();
现在您可以通过调用constructor.newInstance()
来创建一个新实例。至于“将其作为成员变量添加到另一个类中”,为什么需要这样做?对于目标类来说,拥有某种类型的列表会容易得多,然后您只需将新实例插入到该列表中即可。或者,如果您确切知道目标类需要什么类型的对象,请预先创建成员变量,然后您可以直接提供它(通过构造函数或通过 setter)。
关于java - 在 Java 运行时将对象作为成员变量添加到新类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34012084/