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);
最佳答案
这两个调用调用相同的构造函数,即零参数构造函数:
klass.newInstance()
klass.getDeclaredConstructor().newInstance()
如果构造函数不是公共(public)的,则两者都执行相同的运行时检查以验证调用者的访问权限。唯一的区别是#2 包装了任何已检查的异常,而不是直接抛出。否则它们是相同的,您可以将一个替换为另一个。
但这是不同的:
klass.getConstructor().newInstance()
因为它只能返回一个公共(public)构造函数。如果构造函数不是公共(public)的,它会抛出 NoSuchMethodException
。
所以除非您知道构造函数是公共(public)的,否则不能将其更改为 getConstructor()
。
关于Java 9 替换 Class.newInstance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53257073/