如何在Java中动态创建对象的新实例?

时间:2010-07-12 09:28:41

标签: java

我有一个名为GetInput.java的班级 我有一个名为GetNotReleasedInput.java的班级。 我在GetInput中延伸GetNotReleasedInput。 在GetInput中,我调用了一个名为addLineToArray()的私有函数 在该函数中,我定义了一个新类,其中包含有关导入的详细信息。

但是,因为我正在为所有输入文件创建一个通用类(GetInput), 我不能在addLineToArray()中说:

AAData nextData = new AAData();

因为我有AA / Not Released,在这种情况下它应该是NotReleased。 那么如何在该函数中动态生成新的nextData

3 个答案:

答案 0 :(得分:2)

要么创建一个受保护的方法来创建nextData对象,以便子类可以决定如何进行制造,或者您有某种工厂对象(可在外部对象创建时配置),您可以将其委托给。执行后者的最简单方法是传入Class并调用其newInstance()方法,但有一个 lot 更复杂的可能性;一本关于软件模式的书将在这方面深入探讨。

但是,如果您可以将整个事务委托给GetInput的子类,那么这是最简单的。 (您没有为我提供足够的信息,以便能够确定您应该使用哪种模式。)

答案 1 :(得分:1)

听起来您可能想要一个虚拟factory method,您可以在其中放置对象。在addLineToArray()中,您可以致电 您的虚拟createLineObject()而不是new AAData()

但是,确切的方法取决于许多因素:创建的数据类型取决于GetInput类,还是单独决定(您的GetInput类可能会有所不同行为,而数据可能因格式而异)?是否所有数据都相关(例如继承自AAData)?

您应该添加有关您要完成的内容的更多详细信息。

答案 2 :(得分:0)

默认情况下,Java不允许在运行时修改元数据。您可以使用asm编写自己的类加载器,并在类加载时修改字节码,但这可能不是您想要的。

相反,我建议您所有的类数据类都实现Iterable或类似的东西,以便您可以轻松地加入然后迭代所有行而不知道实际类型。