我正在使用Configuration Loader类,以便我可以通过外部文本文件(config.txt)更改程序的参数,而不必每次更改时都重新编译我的代码.
有人建议我使用Java的Reflection来做这件事,但是我对如何实现它有点困惑.
我已经能够从我的文本文件中成功提取其构造函数的类名和参数,但是如何从此实例化到实例化对象?
到目前为止,这是我的方法:
public void loadObject(String classString, HashMap hm)
{
String className = props.getProperty(classString);
Class c = Class.forName(className);
}
Run Code Online (Sandbox Code Playgroud)
classString是一个包含类名称的字符串,hm是一个hashmap,其中类的构造函数参数映射到它们的预期值.
也就是说,class Foo (int xPos, float yPos)"xPos"将映射到预期int的字符串,"yPos"映射到预期float的字符串.我希望能够返回,new Foo(hm.get"xPos".toInt, hm.get"yPost".toFloat)但我不确定如何动态使用这样的构造函数(问题是,有多个可能的类 - 例如,它可能是一个bar而不是一个foo).
我知道可以基于classString做一个if/else,并且在识别它之后简单地调用正确的构造函数,但我希望创建一个更加可扩展的代码,每次添加时都不需要重写该课程的新课程.
所有可能的对象都从单个父对象继承.
mat*_*t b 15
您将使用Class.getConstructor(Class<?>... parameterTypes)后跟的构造函数的引用Constructor.newInstance(Object... initargs).
但是我建议看一下依赖注入框架,比如Spring或Guice,因为它听起来像你正在创建的是他们所做的基本版本.
根据要求扩大此答案:
Class c = Class.forName(name);
Constructor ctor = c.getConstructor(Integer.class, Integer.class);
Integer param1 = hm.get("xPos") ...;
Integer param2 = hm.get("yPos") ...;
Object instanceOfTheClass = ctor.newInstance(param1, param2);
Run Code Online (Sandbox Code Playgroud)
当然代替param1和param2你会根据输入文件中的内容创建一个参数数组(参数也是如此getConstructor()),等等.