首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Class.getConstructor函数参数

Class.getConstructor函数参数
EN

Stack Overflow用户
提问于 2018-02-07 16:38:29
回答 3查看 3.6K关注 0票数 3

我正在研究这段代码,被塞进了评论行:

代码语言:javascript
复制
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})使我感到困惑,他的目的是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-07 16:42:25

根据Java文档:

代码语言:javascript
复制
public Constructor<T> getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException

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

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

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

代码语言:javascript
复制
T risultato = (T)costruttore.newInstance(new Object[] {id});
票数 2
EN

Stack Overflow用户

发布于 2018-02-07 16:46:01

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

代码语言:javascript
复制
public X(int a, int b)

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

Java文档

票数 0
EN

Stack Overflow用户

发布于 2018-02-07 16:47:22

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

签名包括构造函数的类型参数。签名还包括方法名,但是对于构造函数来说,方法名始终是源代码中的类名,并且在编译的代码中总是"“,所以您不需要指定它。

因此,如果您有新的Class[] {int.class},则表示签名由一个类型为"int“的参数组成。这意味着您需要类名X的构造函数X(int )(注意,重要的只是参数的类型,而不是参数变量的名称)。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48668919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档