Class.getConstructor函数参数

时间:2018-02-07 16:38:29

标签: java class reflection getconstructor

我正在研究这段代码并被困在评论行中:

protected <T> T creaOggetto(Class<T> classe, int id) {
    try {
        Package pacchetto = classe.getPackage();
        String nomePacchetto = pacchetto.getName();
        String nomeClasse = classe.getSimpleName();
        String nomeClasseRisultato = nomePacchetto + ".impl." + nomeClasse + "Impl";
        Class<?> classeRisultato = Class.forName(nomeClasseRisultato);
        Constructor<?> costruttore = classeRisultato.getConstructor(new Class[] {int.class});

        @SuppressWarnings("unchecked")
        T risultato = (T)costruttore.newInstance(new Object[] {id});

        return risultato;
    } catch (Throwable throwable) {
        throwable.printStackTrace();
    }
    return null;
}

我知道getConstructor()会返回该类的构造函数对象,但(new Class[] {int.class})会让我感到困惑,他的目的是什么?

3 个答案:

答案 0 :(得分:1)

根据Java文档:

public Constructor<T> getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException
  

返回反映指定public的Constructor对象   此Class对象表示的类的构造函数。该   parameterTypes参数是一个标识的Class对象数组   构造函数的形式参数类型,按声明的顺序。如果这   Class对象表示在非静态中声明的内部类   上下文,形式参数类型包括显式封闭   instance作为第一个参数。

因此,classeRisultato.getConstructor(new Class[] {int.class});会返回只接受一个int参数的构造函数,如果不存在,则返回NoSuchMethodException

在您发布的代码中,请注意,使用该构造函数,它会创建一个传递id的类的新实例,即实际的int参数:

T risultato = (T)costruttore.newInstance(new Object[] {id});

答案 1 :(得分:0)

getConstructor(new Class []); method接受一个Classes数组,表示您想要获取的构造函数的参数。 例如,如果您在类X中有一个构造函数,

public X(int a, int b)

您可以使用X.getClass().getConstructor(new Class[] {int.class, int.class});获取所述构造函数 数组中的两个int.class参数表示构造函数接受的两个int。

Java Documentation

答案 2 :(得分:0)

由于可能存在多个构造函数,因此您需要指定构造函数的签名,以便在调用Class.getConstuctor时获取所需的构造函数。

签名包含构造函数的类型参数。签名还包括方法名称,但对于构​​造函数,方法名称始终是源代码中的类名,并始终为&#34;&lt; init&gt;&#34;在编译的代码中,所以你不需要指定。

因此,如果您有新的Class [] {int.class},那么您所说的签名包含一个类型&#34; int&#34;的单个参数。这意味着你想要类名X的构造函数X(int x)(注意它只是重要参数的类型,而不是参数变量的名称)。

另请注意,int.class解析为java.lang.Integer.TYPE,用于表示基本类型&#34; int&#34;。