如何在java中动态创建类的实例?

如何在java中动态创建类的实例?,java,casting,Java,Casting,我想动态创建一个对象 我的结构如下: 1个抽象类和从抽象类继承的几个类 抽象公共类A{..} 公共类B扩展了{..} 公共类C扩展了{..} 我有一个配置文件,我想在其中添加一个类名,以便能够控制应该使用哪个类 # config class name classname = B 我尝试了下面的方法,但这里我有一个问题,那就是我必须计算结果 我不知道如何在这一点上动态地做到这一点 公共类TestClass{ 公共研究所; public void getInstance(){ this.ins

我想动态创建一个对象

我的结构如下: 1个抽象类和从抽象类继承的几个类

抽象公共类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子类时,我总是必须扩展此代码。我希望避免这种情况。