Java 9 替换 Class.newInstance

标签 java reflection constructor java-9

Class.newInstance在 Java 9 中被弃用:

clazz.newInstance()

can be replaced by

clazz.getDeclaredConstructor().newInstance()

问题是 getDeclaredConstructor返回任何构造函数而不考虑访问级别。

如果我想替换我的代码中所有出现的地方(在不同的包/访问级别),我应该使用 getConstructor获得公共(public)构造函数?

the Constructor object of the public constructor that matches the specified parameterTypes

或者不能批量替换所有出现的地方,因为它需要根据情况(如果存在公共(public)构造函数和/或如果我有正确的访问级别类(class))?

编辑

获取声明构造函数:

   return getConstructor0(parameterTypes, Member.DECLARED);

获取构造函数:

   return getConstructor0(parameterTypes, Member.PUBLIC);

最佳答案

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

  1. klass.newInstance()
  2. klass.getDeclaredConstructor().newInstance()

如果构造函数不是公共(public)的,则两者都执行相同的运行时检查以验证调用者的访问权限。唯一的区别是#2 包装了任何已检查的异常,而不是直接抛出。否则它们是相同的,您可以将一个替换为另一个。

但这是不同的:

  1. klass.getConstructor().newInstance()

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

所以除非您知道构造函数是公共(public)的,否则不能将其更改为 getConstructor()

关于Java 9 替换 Class.newInstance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53257073/

相关文章:

java - 如何使用 Java 日历从日期中减去 X 天?

java - 在 osgi list 中递归导出包及其所有子包

java - 确定构造函数中的哪个参数用于设置类中的特定字段?

java - 使用 HQL 返回字符串

java - 谷歌语音java getSMS()

java - 在java中获取反射类的实例

java - 如何动态生成接口(interface)的实现

c++ - 初始化期间针对安全检查的指针的常量正确性

c++ - 构造函数初始化 Vs 赋值

C++ 模板限制成员构造函数