我正在使用JAVA7。我在课堂下面。
public class SomeClass<B extends Base, L extends Last>{
Class<L> last;
Class<B> base;
public SomeClass(Class<L> last, Class<B> base){
this.last=last;
this.base=base;
}
}
这里我需要创建一个接受类类型并创建其实例并返回的方法。我怎么能这样做?
public returnclassinstance createInstance(Class class)
我会通过传递last / base来调用此方法。此方法必须创建传递的类类型的实例并返回相同的类型。有可能吗?
谢谢!
答案 0 :(得分:1)
要基于java Class
类型创建新实例,您应该使用以下内容:
public <T> T createInstance(Class<T> clazz) throws InstantiationException, IllegalAccessException {
return clazz.newInstance();
}
请注意T
应该有公共默认构造函数。如果您想使用其他默认构造函数来创建Class
的新实例,那么您应该考虑反思(例如clazz.getDeclaredConstructors()
)。
编辑:使用带参数的构造函数
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Test {
public Test(String arg) {
System.err.println("I'm in consturctor with one String arg: " + arg);
}
public static <T extends Test> T createInstance(Class<T> clazz) throws InstantiationException,
IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Constructor<T>[] constructors = (Constructor<T>[]) clazz.getDeclaredConstructors();
Constructor<T> constructor = constructors[0];
return constructor.newInstance("ARG");
}
public static void main(String[] args) throws Exception {
createInstance(Test.class);
}
}
运行此代码后,您应该输出:
I'm in consturctor with one String arg: ARG
但请注意这段代码是多么丑陋 - 在我看来,使用Java中的反射创建这样的对象是最后一个选项(如果我们没有任何其他解决方案)。