我有几个类,说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()
。详情请参考文档
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
}