Java 9替换Class.newInstance

时间:2018-11-12 06:44:13

标签: java reflection constructor java-9

Class.newInstance在Java 9中已弃用:

clazz.newInstance()
     

可以替换为

clazz.getDeclaredConstructor().newInstance()

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

如果我想替换代码中所有出现的内容(在不同的包/访问级别),是否应该使用getConstructor来获取公共构造函数?

  

与指定parameterTypes匹配的公共构造函数的Constructor对象

或者不能批量替换所有出现的内容,因为它需要根据情况而定(如果存在公共构造函数和/或如果我具有正确的访问权限,该课程)?

编辑

getDeclaredConstructor:

   return getConstructor0(parameterTypes, Member.DECLARED);

getConstructor:

   return getConstructor0(parameterTypes, Member.PUBLIC);

1 个答案:

答案 0 :(得分:8)

Class.newInstance()调用零参数构造函数,无论它是否是公共的。它对调用者对该构造函数的访问进行运行时检查。

调用getDeclaredConstructor()将返回相同的构造函数。调用getDeclaredConstructor().newInstance()执行相同的运行时检查。除了对异常的不同处理之外,它执行相同的操作。

否,请勿将其更改为getConstructor()。对于非公共构造函数,这将导致NoSuchMethodException