当前位置: 首页 > 面试题库 >

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

呼延曜灿
2023-03-14
问题内容

我正在使用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是一个哈希图,其中类的构造函数参数映射为其预期值。

即,对于class Foo (int xPos, float yPos),“ xPos”将映射到预期的int字符串,而“
yPos”将映射到预期的float字符串。我 希望 能够返回,new Foo(hm.get"xPos".toInt, hm.get"yPost".toFloat)但是我不确定如何动态使用这样的构造函数(问题是,有多个可能的类,例如,可能是a bar而不是a
foo)。

我知道有可能基于classString进行if /
else,并在以这种方式识别后直接调用适当的构造函数,但是我希望创建一个更具扩展性的代码,而不必每次添加时都进行重写该程序的新类。

所有可能的对象都从单个父对象继承。


问题答案:

您将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);

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



 类似资料:
  • 我不能创建B-Object,但为什么呢? 例外情况是:

  • 我正试图为一个使用泛型类型参数进行参数化的类施展一些Guava 魔法,但是当我试图通过< code > class . forname(String)方法实例化它时,却得到一个< code > ClassNotFoundException 。 我得到这个例外: "无法找到

  • 用户类 我把这个复制方法叫做 并在执行writeMethod.invoke(dest,val)时获得以下异常。有人能帮忙吗? 对象不是在java.base/jdk.internal.reflect.nativeMethodAccessorImpl.Invoke0(原生方法)在java.base/jdk.internal.reflect.nativeMethodAccessorImpl.Invoke

  • 本文向大家介绍JavaScript对象反射用法实例,包括了JavaScript对象反射用法实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript对象反射用法。分享给大家供大家参考。具体如下: 这里讲述JavaScript对象反射用法,涉及反射DOM对象和自定义对象 希望本文所述对大家的javascript程序设计有所帮助。

  • 问题内容: 对于具有所有带有公共静态方法的实用程序类,正确的方法是什么? 我应该使用最终班还是抽象班? 请提出建议。 例如: 要么 问题答案: 有自己的目的。如果您希望其他类()实现某些类功能,则可以使用abstract。 如果它只是实用程序类,但是您不希望其他类将其子类化,那么我将选择类。如果实用程序类只有方法,则您无法以任何方式覆盖它们,因此将它们也包含在类中也没有区别。

  • 我试图比较两个对象,看看它们是否相同,使用hamcrest for flex-Unit,但是当对象有子对象时,它只是抛出一个错误: 我希望它做一个资产(…,hasProperties(…);在子对象上。 有没有办法得到,或者我应该创建一个自定义匹配器? 编辑 我要测试的对象结构的一个示例: 由于expected和objectUnderTest具有相同的结构,测试应该通过,但返回错误: 另外,如果有