3

我正在研究这段代码并陷入了评论行:

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

4

3 回答 3

2

根据 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});
于 2018-02-07T16:42:25.433 回答
0

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

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

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

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

于 2018-02-07T16:47:22.193 回答
0

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

public X(int a, int b)

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

Java 文档

于 2018-02-07T16:46:01.807 回答