我正在研究这段代码,被塞进了评论行:
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})使我感到困惑,他的目的是什么?
发布于 2018-02-07 16:42:25
根据Java文档:
public Constructor<T> getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException返回一个Constructor对象,该对象反映由该class对象表示的类的指定公共构造函数。parameterTypes参数是一个类对象数组,它按照声明的顺序标识构造函数的形式参数类型。如果这个Class对象表示在非静态上下文中声明的内部类,则形式参数类型包括显式包围实例作为第一个参数。
因此,classeRisultato.getConstructor(new Class[] {int.class});返回一个构造函数,如果它不存在,它只接受一个int参数或NoSuchMethodException。
在您发布的代码中,请注意,使用该构造函数,它将创建一个传递id的类的新实例,即实际的int参数:
T risultato = (T)costruttore.newInstance(new Object[] {id});发布于 2018-02-07 16:46:01
getConstructor(新Class[]);方法接受表示要获取的构造函数的参数的类数组。例如,如果您在X类中有一个构造函数,
public X(int a, int b)您可以使用X.getClass().getConstructor(new Class[] {int.class, int.class});获得上述构造函数,数组中的两个int.class参数表示构造函数接收的两个ints。
发布于 2018-02-07 16:47:22
由于可能存在多个构造函数,因此在调用Class.getConstuctor时,需要指定构造函数的签名才能获得所需的签名。
签名包括构造函数的类型参数。签名还包括方法名,但是对于构造函数来说,方法名始终是源代码中的类名,并且在编译的代码中总是"“,所以您不需要指定它。
因此,如果您有新的Class[] {int.class},则表示签名由一个类型为"int“的参数组成。这意味着您需要类名X的构造函数X(int )(注意,重要的只是参数的类型,而不是参数变量的名称)。
还请注意,int.class解析为java.lang.Integer.TYPE,它用于表示原语类型"int“。
https://stackoverflow.com/questions/48668919
复制相似问题