【问题标题】:instantiate class from class object从类对象实例化类
【发布时间】:2010-06-14 11:23:08
【问题描述】:

在java中,我可以使用类对象来动态实例化该类型的类吗?

即我想要一些这样的功能。

Object foo(Class type) {
    // return new object of type 'type'
}

【问题讨论】:

    标签: java class new-operator


    【解决方案1】:

    在 Java 9 及更高版本中,如果有声明的零参数(“nullary”)构造函数,您将使用 Class.getDeclaredConstructor() 获取它,然后对其调用 newInstance()

    Object foo(Class type) throws InstantiationException, IllegalAccessException, InvocationTargetException {
        return type.getDeclaredConstructor().newInstance();
    }
    

    在 Java 9 之前,您会使用 Class.newInstance

    Object foo(Class type) throws InstantiationException, IllegalAccessException {
        return type.newInstance();
    }
    

    ...但它在 Java 9 中已被弃用,因为它抛出了构造函数抛出的任何异常,甚至是检查异常,但没有(当然)声明这些检查异常,有效地绕过了编译时检查异常处理。 Constructor.newInstance 将构造函数中的异常包装在 InvocationTargetException 中。

    以上都假设有一个零参数构造函数。更健壮的途径是通过Class.getDeclaredConstructorsClass.getConstructors,这将带您使用java.lang.reflect 包中的反射内容,以找到参数类型与您打算给它的参数匹配的构造函数。

    【讨论】:

    • 看起来这种方法自 Java 9 以来已被弃用。
    • @dopatraman - 确实如此,谢谢,就像几年前一样。我已经更新了答案。
    【解决方案2】:

    用途:

    type.newInstance()
    

    对于使用空的构造函数创建实例,或者使用方法type.getConstructor(..)获取相关构造函数然后调用它。

    【讨论】:

      【解决方案3】:

      是的,它被称为反射。您可以为此使用 Class newInstance() 方法。

      【讨论】:

      【解决方案4】:

      使用 newInstance() 方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-13
        • 2013-03-28
        • 2021-04-13
        • 1970-01-01
        • 1970-01-01
        • 2018-12-15
        相关资源
        最近更新 更多