我有几个课,比如MyClassA MyClassB MyClassC和MyClassD
我想要一个函数,给定Class类型会创建(并做任何......)一个对象,它是一个类的实例。
所以我的功能看起来像这样,
public void foo(ClassType MyChoosenClassType){
MyChoosenClassType x=new MyChoosenClassType();
//do whatever with x
}
我有办法做到这一点吗?
或者我是否必须手动完成所有条件和我自己的方式?
答案 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
}