java - 在java中创建对象,在编译时不知道类

标签 java reflection

我有一个 Java 问题。我有一个配置文件,我读取并提取了一些 java 类的路径,假设是字符串的 ArrayList(为方便起见,我将其称为 path2libs)。

我想通过迭代此“path2libs”数组为这些类中的每一个动态创建一个实例。我试过这样的事情:

Class clazz = Class.forName("test.Demo"); 
Demo demo = (Demo) clazz.newInstance();

但我不知道我会读什么课,所以我无法进行适当的转换。

完成后,我想在每个对象上调用一个方法(在每种情况下都是相同的方法)。所有这些对象都基于一个接口(interface),所以我知道它们的方法。

所以,基本上(总而言之)我有两个问题:)

  1. 创建理想的对象
  2. 对每个对象调用一个方法

最佳答案

有很多问题。

首先,Class#newInstance() 期望相应的类有一个带有空参数列表的public 构造函数。因此,您必须确保要使用的所有类都具有它。否则,您需要获取适当的 Constructor,使其可访问,并提供适当的参数。

其次,您知道所有类在运行时共享的接口(interface)吗?如果这样做,您可以将所有实例转换为该接口(interface)类型

InterfaceType interfaceInstance = (InterfaceType) clazz.newInstance();
interfaceInstance.interfaceMethod(/* arguments */);

如果不这样做,您将不得不再次依赖反射。

您需要检索相应方法的 Method,在方法的参数列表中提供每个参数的类型。

Method method = clazz.getDeclaredMethod("methodName" /*, possible parameter list types */);

然后您可以在类的实例上调用该方法,再次提供适当的参数。

method.invoke(interfaceInstance /*, possible arguments */);

关于java - 在java中创建对象,在编译时不知道类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22274860/

相关文章:

java - 返回数组前 n 个位置之和的函数

java - <使用 Jsoup 解析 html 时缺少输入值?

java - while 循环中的日历问题

c# - 查看/检索属性

scala - 我们应该直接使用 ScalaSignature 吗?

java - 如何在 `PreparedStatement` 中提供一个表达式作为参数

java - 在 Swing 中使用角度绘制圆弧

Java 循环属性并使用反射修改默认值

java - 反射创建匿名类

java - 在运行时扩展类