繁体   English   中英

Class.getConstructor 函数参数

[英]Class.getConstructor function parameters

我正在研究这段代码并被困在注释行中:

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})让我感到困惑,他的目的是什么?

根据 Java 文档:

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

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

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

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

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

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

public X(int a, int b)

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

Java 文档

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

签名包括构造函数的类型参数。 签名还包括方法名,但对于构​​造函数,方法名在源代码中始终是类名,在编译代码中始终是“<init>”,因此您无需指定。

所以如果你有 new Class[] {int.class} 那么你是说签名由一个“int”类型的参数组成。 这意味着您需要类名 X 的构造函数 X(int x) (请注意,重要的是参数的类型,而不是参数变量的名称)。

另请注意,int.class 解析为 java.lang.Integer.TYPE,用于表示原始类型“int”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM