我正在研究这段代码并被困在评论行中:
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})
会让我感到困惑,他的目的是什么?
答案 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。
答案 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;。