如何创建“动态(在运行时决定)”类的实例?

时间:2015-10-23 12:25:57

标签: java generics

我有几个课,比如MyClassA MyClassB MyClassC和MyClassD

我想要一个函数,给定Class类型会创建(并做任何......)一个对象,它是一个类的实例。

所以我的功能看起来像这样,

public void foo(ClassType MyChoosenClassType){
       MyChoosenClassType x=new MyChoosenClassType();
       //do whatever with x
}

我有办法做到这一点吗?

或者我是否必须手动完成所有条件和我自己的方式?

2 个答案:

答案 0 :(得分:1)

您可以使用Class.getConstructor()Constructor.newInstance()方法使用Java Reflection API执行此操作:

public <T extends MyClassParent> void foo(Class<T> classType) throws Exception {
    T instance = (T) classType.getConstructor().newInstance(); // no-args constructor assumed

    // work with instance, which is a subclass of MyClassParent
}

只要MyClassParent的所有子类都有一个no-args构造函数,它就可以工作。如果它们都有另一个构造函数,则可以将期望参数的类传递给Class.getConstructor(),将实际参数值传递给Constructor.newInstance()。有关详细信息,请参阅文档。

但是,使用Java 8,您可以避免使用反射:

Map<String, Supplier<? extends MyClassParent>> facotries = new HashMap<>();

factories.put("MyChosenClassType1", MyChosenClassType1::new);
factories.put("MyChosenClassType2", MyChosenClassType2::new);
// etc

然后,您可以按如下方式实施foo方法:

public void foo(String classType) {
    Supplier<? extends MyClassParent> factory = factories.get(classType);
    if (factory != null) {
        MyClassParent instance = factory.get();

        // work with instance
    }
}

答案 1 :(得分:0)

我不确定是否有办法完成我在问题中提到的内容;然而,这是我最终提出的解决方案。不像我在问题中的示例代码中提到的那么容易和直截了当。 正如Jimmy T.提到的那样

public void foo(Object anyObjectOfTypeMyClass){
       Object x=anyObjectOfTypeMyClass.getClass().newInstance();
       //do anything with x
}