如何在java中动态创建类的实例?
我想动态创建一个对象 我的结构如下: 1个抽象类和从抽象类继承的几个类如何在java中动态创建类的实例?,java,casting,Java,Casting,我想动态创建一个对象 我的结构如下: 1个抽象类和从抽象类继承的几个类 抽象公共类A{..} 公共类B扩展了{..} 公共类C扩展了{..} 我有一个配置文件,我想在其中添加一个类名,以便能够控制应该使用哪个类 # config class name classname = B 我尝试了下面的方法,但这里我有一个问题,那就是我必须计算结果 我不知道如何在这一点上动态地做到这一点 公共类TestClass{ 公共研究所; public void getInstance(){ this.ins
抽象公共类A{..}
公共类B扩展了{..}
公共类C扩展了{..}
我有一个配置文件,我想在其中添加一个类名,以便能够控制应该使用哪个类
# config class name
classname = B
我尝试了下面的方法,但这里我有一个问题,那就是我必须计算结果
我不知道如何在这一点上动态地做到这一点
公共类TestClass{
公共研究所;
public void getInstance(){
this.instB=Class.forName(“B”)/*稍后我在这里输入配置值classname*/
.getConstructor(String.class)
.newInstance(新对象[]{“test”});//只需将其强制转换为:
instB = (A)Class....newInstance(...);
你不需要知道确切的类别。我不明白为什么你真的需要使用反射。我建议使用一个简单的策略模式,例如:
Strategy.java
public interface Strategy {
void doWork();
}
StrategyA.java
public class StrategyA implements Strategy {
@Override
public void doWork() {
}
}
策略B.java
public class StrategyB implements Strategy {
@Override
public void doWork() {
}
}
Main.java
public class Main {
public static void main(String[] args) {
// read the option from a config file
String option = "B";
Strategy strategy = createStrategy(option);
// create a context with the strategy
MyContext context = new MyContext(strategy);
context.doWork();
// config has changed dynamically, change the strategy
context.useStrategy(new StrategyA());
context.doWork();
}
public static Strategy createStrategy(String strategy) {
if (strategy.equals("A")) {
return new StrategyA();
}
return new StrategyB();
}
}
MyContext.java
public class MyContext {
Strategy strategy;
public MyContext(Strategy strategy) {
this.strategy = strategy;
}
public void useStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void doWork() {
strategy.doWork();
}
}
我不知道到底是什么让你困惑。你使用newInstance
调用构造函数,提供参数,比如newInstance(“test”)
,然后你必须手动强制转换,比如(A)Class.forName(…)…
。如果你坚持强制转换到子类:首先,获取对象。然后使用“的实例”检查类型注意,如果B
扩展了A
@Zabuza,那么instanceof
是过时的这里?在运行构造函数之前,最好使用isAssignableFrom
测试加载的类,而不是使用instanceof
,因为如果构造函数不是合适的类,它可能会产生不必要的副作用。在这种情况下,实例的类型不是A吗?我总是需要我定义的类的实例在配置中,因为它可能还有其他方法和成员。不,真正的类型不是a,而是扩展了a的某个类。如果您编写Object o=“string”,o的实际类型是字符串,而不是对象。声明的类型和实际类型之间存在差异。解决方案可能可行,但每当我有一个新的a子类时,我总是必须扩展此代码。我希望避免这种情况。