我正在使用Configuration Loader类,以便通过外部文本文件(config.txt)更改我的程序参数,而不必在每次更改时重新编译我的代码。在运行时使用反射实例化未知类的对象的正确方法是什么?
有人建议我使用Java的Reflection来做到这一点,但我有点困惑,我该如何实际实现它。
我已经能够成功地从我的文本文件中提取类构造函数的类名和参数,但是我该如何从此实例化对象呢?
这里就是我有我的方法至今:
public void loadObject(String classString, HashMap hm)
{
String className = props.getProperty(classString);
Class c = Class.forName(className);
}
classString是包含类的名称的字符串,和HM是一个HashMap在类的构造函数的参数映射到它们的预期值。
即,对于class Foo (int xPos, float yPos)
,“xPos”将映射到预期的int的字符串,并且“yPos”映射到预期的浮点的字符串。我想想要能够返回,new Foo(hm.get"xPos".toInt, hm.get"yPost".toFloat)
,但我不确定如何动态地使用这样的构造函数(问题是,有多个可能的类 - 例如它可能是bar
而不是foo
)。
我知道它有可能在基于classString的基础上执行if/else,并且在以这种方式识别它之后简单地调用正确的构造函数,但是我期待创建一个不必重写的更可扩展的代码每次我为程序添加一个新类。
所有可能的对象都从一个父对象继承。
恐怕我不明白你的伪代码的第一行。我根本不熟悉Reflection,所以我不确定你的代码实际上在做什么*。有可能扩大你的答案一点吗? –
哦,好的,那么,按照上面的示例,Foo.GetConstructor会返回一个(int,float)数组?然后从那里我可以正确地将对象投射到Constructor.newInstance的initargs中? –
+1使用现有解决方案进行Bean管理 –