【发布时间】:2019-08-21 21:44:11
【问题描述】:
Class.newInstance 在 Java 9 中已弃用:
clazz.newInstance()可以替换为
clazz.getDeclaredConstructor().newInstance()
问题是getDeclaredConstructor 返回任何构造函数而不考虑访问级别。
如果我想替换我的代码中的所有出现(在不同的包/访问级别),我应该使用getConstructor 来获取公共构造函数吗?
与指定 parameterTypes 匹配的公共构造函数的 Constructor 对象
或者不能我 bulk 替换所有出现,因为它需要根据情况(如果存在公共构造函数和/或如果我具有正确的访问级别类)?
编辑
getDeclaredConstructor:
return getConstructor0(parameterTypes, Member.DECLARED);
获取构造函数:
return getConstructor0(parameterTypes, Member.PUBLIC);
【问题讨论】:
-
如果需要访问不同层次的构造函数,getDeclaredConstructor(s)是唯一的出路。你不能使用
getDeclaredConstructors()(不是getDeclaredConstructor())来获取所有构造函数并根据你的逻辑替换一个吗? -
正如弃用消息所说,
clazz.newInstance()的等效代码是clazz.getDeclaredConstructor().newInstance()。我认为这意味着您成功使用clazz.newInstance()的任何地方都可以替换为推荐的代码。如果您将clazz.newInstance()替换为clazz.getConstructor().newInstance(),您将更改代码的语义。 -
我没有尝试过,但如果零参数构造函数不公开,我也不希望
clazz.newInstance()工作——是吗?那么在实践中使用clazz.getDeclaredConstructor().newInstance()会失去什么? -
@OleV.V.是的,
Class.newInstance()与非公共构造函数一起使用。但它要求您具有适当的访问权限,否则它会抛出IllegalAccessException(来自一些快速、非详尽的测试)。 -
相关(关于它被弃用的原因):stackoverflow.com/questions/195321/…
标签: java reflection constructor java-9