如何使用Class类实例化对象?
我想将一个Class对象传递给一个函数,并让该函数返回我传入的类的新对象。
在我拿回物体后,我将进行施法。此外,对于此类事情的设计模式是否有任何建议?
以下是一些示例伪代码,显示了我想要做的事情:
Class Animal {
String name;
}
Class Cat extends Animal {
boolean hasTail;
}
主要:
Class myClass = Cat.class;
Animal createAnimal(myClass) {
return new myClass;
}
编辑:
另外,有没有办法在返回新实例之前在我的函数中进行转换,或者我是否坚持使用默认的Object类型?
return (myClass)myClass.newInstance();
答案 0 :(得分:6)
我怀疑你想要Class.newInstance()
。请注意,您使用的是Cat.class
,而不是Cat.getClass()
。
请注意newInstance()
将始终尝试调用无参数构造函数 - 如果需要传递任何参数,请使用getConstructors()
查找该类声明的构造函数,然后调用相应的构造函数。
答案 1 :(得分:2)
在我拿回物体后,我将进行施法。
另外,有没有办法在返回新实例之前在我的函数中进行转换,或者我是否坚持使用默认的Object类型?
如果您利用泛型,则无需进行投射。泛型以相对介绍性的细节here
进行描述这是一个使用泛型和反射从你的伪代码派生的java示例:
public class ReflectionNewInstanceTest {
static class Animal {
String name;
}
static class Cat extends Animal {
boolean hasTail = true;
}
public static void main(String[] args) throws Exception {
Animal a = createAnimal(Cat.class);
}
static <T extends Animal> T createAnimal(Class<T> clazz) throws Exception {
return clazz.newInstance();
}
}
对于模式,当您想抽象出对象的创建时,应该查看任何典型的创建模式。最简单的可能就是使用工厂方法。我上面的例子只是一个通用的工厂方法,并没有真正获得太多。这是一个非常简短的模式列表,你应该查找:
答案 2 :(得分:1)
您可能正在分别在Class,Constructor类中查找getConstructor()和newInstance()方法。
如果您的构造函数保证没有参数,您也可以将其缩写并使用newInstance() [在Class]中