【发布时间】:2020-02-09 12:38:51
【问题描述】:
我想动态创建一个对象。
我有以下结构: 1个抽象类和几个继承自抽象类的类
abstract public class A {..}
public class B extends A{..}
public class C extends A{..}
我有一个配置文件,我想在其中添加一个类名,以便能够控制应该使用哪个类。
# config class name
classname = B
我尝试了以下方法,但在这里我遇到了我必须转换结果的问题 而且我现在不知道如何动态地做到这一点
public class TestClass {
public A instB;
public void getInstance(){
this.instB = Class.forName("B") /*here i put later the config value classname*/
.getConstructor(String.class)
.newInstance(new Object[]{"test"}); // <--- How to cast this dynamicly to a class in the config?
}
}
如何动态创建类的实例?
【问题讨论】:
-
我不确定到底是什么让您感到困惑。您使用
newInstance调用构造函数,提供您的参数,例如newInstance("test"),然后您必须手动转换,例如(A) Class.forName(...)...。 -
如果你坚持强制转换为子类:首先,获取对象。然后使用“instance of”检查类型并进行强制转换。
-
请注意,如果
B扩展A,instanceof已过时。 -
@Zabuza 这里的“过时”是什么意思?
-
最好在运行构造函数之前使用
isAssignableFrom测试加载的类,而不是使用instanceof,因为如果构造函数不是合适的类,可能会产生不必要的副作用.