Java 9替换Class.newInstance

Java 9替换Class.newInstance,java,reflection,constructor,java-9,Java,Reflection,Constructor,Java 9,在Java 9中被弃用: 可以用 clazz.getDeclaredConstructor().newInstance() 问题是返回任何构造函数时都不考虑访问级别 如果我想替换代码中的所有引用(在不同的包/访问级别上),我应该使用它来获取公共构造函数吗 与指定参数类型匹配的公共构造函数的构造函数对象 或者,不能我批量替换所有出现的情况,因为它需要按情况(如果存在公共构造函数和/或如果我对该类具有正确的访问级别) 编辑 getDeclaredConstructor: getConstructo

在Java 9中被弃用:

可以用

clazz.getDeclaredConstructor().newInstance()
问题是返回任何构造函数时都不考虑访问级别

如果我想替换代码中的所有引用(在不同的包/访问级别上),我应该使用它来获取公共构造函数吗

与指定参数类型匹配的公共构造函数的构造函数对象

或者,不能我批量替换所有出现的情况,因为它需要按情况(如果存在公共构造函数和/或如果我对该类具有正确的访问级别)

编辑

getDeclaredConstructor:

getConstructor:


这两个调用调用同一个构造函数,即零参数构造函数:

  • klass.newInstance()
  • klass.getDeclaredConstructor().newInstance()
  • 如果构造函数不是公共的,则两者都执行相同的运行时检查以验证调用方的访问。唯一的区别是#2包装所有已检查的异常,而不是直接抛出。否则,它们是相同的,您可以用一个替换另一个

    但这是不同的:

  • klass.getConstructor().newInstance()
  • 因为它只能返回一个公共构造函数。如果构造函数不是公共的,它会抛出一个
    NoSuchMethodException


    因此,除非您知道构造函数是公共的,否则无法将其更改为
    getConstructor()

    如果您需要访问不同级别的构造函数,getDeclaredConstructor是唯一的出路。不能使用
    getDeclaredConstructors吗​()
    (不是
    getDeclaredConstructor()
    )根据您的逻辑获取所有构造函数并替换一个?正如弃用消息所说,与
    clazz.newInstance()
    等价的代码是
    clazz.getDeclaredConstructor().newInstance()
    。我假设这意味着,无论您在哪里成功使用
    clazz.newInstance()
    ,都可以用推荐的代码替换。如果您将
    clazz.newInstance()
    替换为
    clazz.getConstructor().newInstance()
    ,您正在更改代码的语义。我还没有尝试过,但是如果零参数构造函数不是公共的,我也不希望
    clazz.newInstance()
    工作-是吗??那么,如果使用
    clazz.getDeclaredConstructor().newInstance()
    ,在实践中会损失什么呢?@OleV.V。是的,
    Class.newInstance()
    可用于非公共构造函数。但它需要您拥有正确的访问权限,否则它会抛出一个
    非法访问异常
    (来自一些快速、非详尽的测试)。相关(关于它被弃用的原因):谢谢,所以抛出的任何异常都只会是有效的初始化失败?@user7294900是。
    clazz.getDeclaredConstructor().newInstance()
    
       return getConstructor0(parameterTypes, Member.DECLARED);
    
       return getConstructor0(parameterTypes, Member.PUBLIC);