如何将getConstructor与Generic类一起使用?

时间:2014-10-09 03:15:54

标签: java generics reflection

这是我第一次使用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)

提前感谢您的时间和帮助!!

1 个答案:

答案 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,这样可以让人们更轻松地阅读您的代码并让您阅读其他代码