gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:14:42 27 4
gpt4 key购买 nike

我有一个 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/

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