gpt4 book ai didi

java - 在运行时使用反射实例化未知类对象的正确方法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:08:58 24 4
gpt4 key购买 nike

我正在开发一个配置加载器类,这样我就可以通过外部文本文件 (config.txt) 更改我的程序的参数,而不必在每次更改时都重新编译我的代码。

有人建议我使用 Java 的反射来执行此操作,但我对如何实际实现它感到有点困惑。

我已经能够从我的文本文件中成功提取类名及其构造函数的参数,但我如何从中提取实例化对象?

到目前为止,这是我的方法:

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”映射到预期的 float 字符串。我希望能够返回,new Foo(hm.get"xPos".toInt, hm.get"yPost".toFloat),但我不确定如何返回动态使用这样的构造函数(问题是,有多个可能的类——例如,可能是 bar 而不是 foo)。

我知道可以根据 classString 执行 if/else,并在以这种方式识别后简单地调用适当的构造函数,但我希望创建一个更具扩展性的代码,而不必每次都重写是时候我向程序中添加一个新类了。

所有可能的对象都继承自一个父对象。

最佳答案

您将使用 Class.getConstructor(Class<?>... parameterTypes)获取对构造函数的引用,然后是 Constructor.newInstance(Object... initargs) .

但是我建议看一下依赖项注入(inject)框架,例如 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);

当然不是param1param2您将根据输入文件中的内容创建一个参数数组(getConstructor() 的参数也是如此),等等。

关于java - 在运行时使用反射实例化未知类对象的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7698237/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com