如何创建"dynamic(decided at runtime)"类的实例?



我有几个类,说MyClassA MyClassB MyClassC和MyClassD

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

我的函数是这样的

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

我能做到吗?

您可以使用Java反射API,通过使用Class.getConstructor()Constructor.newInstance()方法:

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的所有子类都有一个无参数构造函数,这就可以工作。如果它们都有另一个构造函数,则可以将期望参数的类传递给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
    }
}

我不确定是否有一种方法可以做到我在问题中确切提到的;然而,这是我最终想出的解决方案。不像我在问题中的示例代码中提到的那么简单和直接。正如Jimmy t提到的

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

最新更新