0

有:

Class<? extends MyInterface> clazz = ...;

我应该(以及为什么)写:

Constructor<? extends MyInterface> ctor = clazz.getConstructor();
MyInterface object = ctor.newInstance();

或者:

MyInterface object = clazz.newInstance();

选择是否取决于我打算使用的构造函数是空的还是带参数?

4

5 回答 5

1

根据Javadoc newInstance()

该类被实例化为一个带有空参数列表的新表达式。如果尚未初始化该类,则将其初始化。

显然,您可以将newInstance()其用作快捷方式

Constructor<? extends MyInterface> ctor = clazz.getConstructor();
MyInterface object = ctor.newInstance();

但是有一个细微的区别:Class#newInstance()将构造函数中的 Excption 包装在 aExceptionInInitializerError中,而Constructor#newInstance()将其包装在 a中InvocationTargetException

于 2013-03-27T13:56:05.717 回答
1

看看这个类似的问题链接还提供了更多示例和更详细的说明。

To sum up the arguments (from the second link):

    Class.newInstance() can only invoke the zero-argument constructor, 
    while Constructor.newInstance() may invoke any constructor, regardless 
    of the number of parameters.

    Class.newInstance() throws any exception thrown by the constructor, 
    regardless of whether it is checked or unchecked. 

    Class.newInstance() requires that the constructor be visible;  
    Constructor.newInstance() may invoke private constructors under certain 
    circumstances.

很抱歉编辑我的帖子以添加更多引用,但这比我能更好地解释它。Class.newInstance()的 Javadoc解释如下:

创建由此 Class 对象表示的类的新实例。该类被实例化为一个带有空参数列表的新表达式。如果尚未初始化该类,则将其初始化。

请注意,此方法传播由 nullary 构造函数引发的任何异常,包括已检查的异常。使用此方法可以有效地绕过编译器执行的编译时异常检查。Constructor.newInstance 方法通过将构造函数抛出的任何异常包装在(已检查)InvocationTargetException 中来避免此问题。

于 2013-03-27T13:57:14.160 回答
0

根据源码of java.lang.Class Class.newInstance()是一样的Constructor.newInstance()

在实现中,调用默认构造函数(没有任何参数的构造函数)

于 2013-03-27T13:55:07.730 回答
0

clazz.newInstance()实际上试图抓住Constructor对象,所以它最终是一样的。

第一种语法允许使用带参数的构造函数来实例化类。

于 2013-03-27T13:56:08.420 回答
0

通读 javadoc for . 答案是显而易见的java.lang.Class

  • clazz.newInstance()方法仅适用于无参数构造函数。

  • , clazz.getConstructor()etc 方法也适用于带参数的构造函数......前提是您提供类型,然后提供构造函数参数的值。

如果您的用例只要求您使用无参数构造函数,那么clazz.newInstance()是更简单的方法。

于 2013-03-27T13:58:16.207 回答