我有一个 Java 问题。我有一个配置文件,我读取并提取了一些 java 类的路径,假设是字符串的 ArrayList(为方便起见,我将其称为 path2libs)。
我想通过迭代此“path2libs”数组为这些类中的每一个动态创建一个实例。我试过这样的事情:
Class clazz = Class.forName("test.Demo");
Demo demo = (Demo) clazz.newInstance();
但我不知道我会读什么课,所以我无法进行适当的转换。
完成后,我想在每个对象上调用一个方法(在每种情况下都是相同的方法)。所有这些对象都基于一个接口(interface),所以我知道它们的方法。
所以,基本上(总而言之)我有两个问题:)
- 创建理想的对象
- 对每个对象调用一个方法
最佳答案
有很多问题。
首先,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/