gpt4 book ai didi

java - 实例化实现接口(interface)的给定类的对象,并使用反射将其添加到 List

转载 作者:行者123 更新时间:2023-12-02 00:08:24 26 4
gpt4 key购买 nike

我有一个接口(interface)“指令”,并且一些指令实现了它(Add、Sub、Mul、Jmp...),为了执行这些指令,我将它们存储在 List 对象中,然后调用execute() 方法。我正在从文件中读取此说明,我想通过从文件中读取的字符串来实例化正确的类,但是当我调用 constructor.newInstance(...) 时,我会丢失引用的类型,并且无法调用没有instanceofs和脏转换的方法(我想避免它们)。

List<Instruction> res = new ArrayList<>()
String className = "Add";
Class<?> classLoaded = Class.forName("instructions." + className);
Constructor<?> constructor = classLoaded.getConstructors()[0];
Object obj = constructor.newInstance(paramsOfConstructor);
res.add(obj);

这可以按照我希望的方式工作,但我想尽可能避免肮脏的转换

Instruction obj = (Instruction) constructor.newInstance(paramsOfConstructor);
res.add(obj);

PD:paramsOfConstructor 是我提供给构造函数的所有对象/基元,我不包含获取它们的代码,因为这将是 30 行左右的复制/粘贴。如果需要的话我也可以复制它们。

最佳答案

您可以使用 Class.asSubclass() 改变你的方法 Class<?> Class.forName(...) 返回的对象到你可以使用的东西。与 getConstructor() 结合使用方法(单数方法,即没有 s 的方法),您可以创建一个 Constructor具有您想要的类型的对象。该代码将类似于以下内容:

Class<?> loadedClass = Class.forName("java.lang.Thread");
Class<? extends Runnable> castedClass = loadedClass.asSubclass(Runnable.class);
Class<?>[] constructorArgumentClasses = new Class<?>[] { String.class }; // pick the constructor: new Thread(String)
Constructor<? extends Runnable> c = castedClass.getConstructor(constructorArgumentClasses);
Runnable t = c.newInstance("abc"); // no casting involved here

System.out.println(t); // Thread[abc,5,main]
System.out.println(t.getClass()); // class java.lang.Thread

您必须重写您使用的代码getConstructor()而不是getConstructors() (无论如何,您只使用一个)因为此方法返回 Constructor<? extends T>对象。

关于java - 实例化实现接口(interface)的给定类的对象,并使用反射将其添加到 List<InterfaceX>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58139983/

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