这是我第一次使用Java中的反射和泛型,所以请原谅我的无知。我试图使用反射和泛型实例化一个类,但在我的玩具程序中得到错误。目标是使用inst类的构造函数进行实例化。
代码:
/*
*This is the builder class to build an instance
*/
package generics.expClassT;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class builder {
public static<E> E createInst(Class<E> c) throws InstantiationException, IllegalAccessException {
//Class<?>[] type = new Class<?>[1];
//type[0] = inst.class;
try {
Constructor<E> ctor = c.getConstructor(c); //c.getConstructor(type);
return (ctor.newInstance("Testing"));
} catch (NoSuchMethodException | SecurityException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
return null;
}
}
}
/*
* This is the class for which we need an instance
*/
package generics.expClassT;
public class inst {
private String var;
public inst(String s) {
this.var = s;
}
public String getVar() {
return var;
}
public static void main(String args[]){
inst instObj;
try {
instObj = builder.createInst(inst.class);
System.out.println(instObj.getVar());
} catch (InstantiationException | IllegalAccessException e) {
//e.printStackTrace();
}
}
}
例外:
java.lang.NoSuchMethodException: generics.expClassT.inst.<init>(generics.expClassT.inst)
at java.lang.Class.getConstructor0(Class.java:2800)
at java.lang.Class.getConstructor(Class.java:1708)
at generics.expClassT.builder.createInst(builder.java:15)
at generics.expClassT.inst.main(inst.java:19)
Exception in thread "main" java.lang.NullPointerException
at generics.expClassT.inst.main(inst.java:20)
提前感谢您的时间和帮助!!
答案 0 :(得分:0)
Constructor<E> ctor = c.getConstructor(c);
应为Constructor<E> ctor = c.getConstructor(String.class);
来自JavaDocs
返回一个Constructor对象,该对象反映此Class对象所表示的类的指定公共构造函数。该 parameterTypes参数是一个标识的Class对象数组 构造函数的形式参数类型,按声明的顺序。如果这 Class对象表示在非静态中声明的内部类 上下文,形式参数类型包括显式封闭 instance作为第一个参数。
要反映的构造函数是由此形式参数类型匹配的Class对象表示的类的公共构造函数 由parameterTypes指定的那些。
<强>参数:强>
parameterTypes - 参数数组
这基本上意味着,getConstructor(Class...)
期望您传递类构造函数定义的类类型,在您的情况下public Inst(String s)
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Builder {
public static <E> E createInst(Class<E> c) throws InstantiationException, IllegalAccessException {
//Class<?>[] type = new Class<?>[1];
//type[0] = inst.class;
try {
Constructor<E> ctor = c.getConstructor(String.class); //c.getConstructor(type);
return (ctor.newInstance("Testing"));
} catch (NoSuchMethodException | SecurityException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
return null;
}
}
}
public class Inst {
private String var;
public Inst(String s) {
this.var = s;
}
public String getVar() {
return var;
}
}
public class Test {
public static void main(String[] args) {
Inst instObj;
try {
instObj = Builder.createInst(Inst.class);
System.out.println(instObj.getVar());
} catch (InstantiationException | IllegalAccessException e) {
//e.printStackTrace();
}
}
}
您可能希望阅读Code Conventions for the Java TM Programming Language,这样可以让人们更轻松地阅读您的代码并让您阅读其他代码