Java 为什么要获取构造函数对象而不是直接创建实例?

Java 为什么要获取构造函数对象而不是直接创建实例?,java,reflection,Java,Reflection,具有: 选择是否取决于我打算使用的构造函数是空的还是带参数的?根据java.lang.Class的源代码 Class.newInstance()与Constructor.newInstance() 在实现中,根据newInstance()的Javadoc调用默认构造函数(没有任何参数的构造函数): 该类被实例化,就像被一个带有空参数列表的新表达式实例化一样。如果尚未初始化该类,则初始化该类 显然,您可以使用newInstance()作为 MyInterface object = clazz.ne

具有:


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

根据java.lang.Class的源代码
Class.newInstance()
Constructor.newInstance()


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

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

显然,您可以使用
newInstance()
作为

MyInterface object = clazz.newInstance();
Constructor
clazz.newInstance()
实际上试图获取
构造函数
对象,因此它最终是相同的

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

看看这个。link还提供了更多的例子和更详细的解释

Constructor<? extends MyInterface> ctor = clazz.getConstructor();
MyInterface object = ctor.newInstance();
很抱歉编辑我的文章来添加更多的引用,但这比我能解释的更好。 Javadoc for对此的解释如下:

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


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

通过对javadoc的详细阅读,答案显而易见

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

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


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

但是由于中间发生了很多事情,我更喜欢使用API文档作为指导,而不是任何实现。我经常看到IBM JDK的行为与Sun/Oracle JDK不同……因此我想,构造函数的使用更安全,因为它会引发
异常,而不是
错误。异常表示程序可能要捕获的问题,而错误表示程序不应尝试捕获的问题。您的应用程序是否应该在这个动态调用的构造函数中捕获异常取决于具体情况……实际上,我以前读过该线程,并认为可能会有进一步的讨论——“内联”示例是受欢迎的!请检查第二段:它不应该是
构造函数
?你是什么意思?我给出的示例直接取自第二个link.Class.newInstance抛出一个
异常InInitializeRerror
看看javadoc for Class.newInstance()它们也解释得稍微多一些:更简单,但抛出一个错误:(
MyInterface object = clazz.newInstance();
Constructor<? extends MyInterface> ctor = clazz.getConstructor();
MyInterface object = ctor.newInstance();
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.