Java 9 replace Class.newInstance

2022-09-02 01:43:06

Class.newInstance 在 Java 9 中被弃用:

clazz.newInstance()

可替换为

clazz.getDeclaredConstructor().newInstance()

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

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

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

或者我不能批量替换所有匹配项,因为它需要按大小写(如果存在公共构造函数和/或如果我具有该类的正确访问级别)?

编辑

getDelaredConstructor:

   return getConstructor0(parameterTypes, Member.DECLARED);

getConstructor:

   return getConstructor0(parameterTypes, Member.PUBLIC);

答案 1

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

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

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

但这是不同的:

  1. klass.getConstructor().newInstance()

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

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


答案 2