Java 9替换Class.newInstance
在Java 9中被弃用: 可以用Java 9替换Class.newInstance,java,reflection,constructor,java-9,Java,Reflection,Constructor,Java 9,在Java 9中被弃用: 可以用 clazz.getDeclaredConstructor().newInstance() 问题是返回任何构造函数时都不考虑访问级别 如果我想替换代码中的所有引用(在不同的包/访问级别上),我应该使用它来获取公共构造函数吗 与指定参数类型匹配的公共构造函数的构造函数对象 或者,不能我批量替换所有出现的情况,因为它需要按情况(如果存在公共构造函数和/或如果我对该类具有正确的访问级别) 编辑 getDeclaredConstructor: getConstructo
clazz.getDeclaredConstructor().newInstance()
问题是返回任何构造函数时都不考虑访问级别
如果我想替换代码中的所有引用(在不同的包/访问级别上),我应该使用它来获取公共构造函数吗
与指定参数类型匹配的公共构造函数的构造函数对象
或者,不能我批量替换所有出现的情况,因为它需要按情况(如果存在公共构造函数和/或如果我对该类具有正确的访问级别)
编辑
getDeclaredConstructor:
getConstructor:
这两个调用调用同一个构造函数,即零参数构造函数:
klass.newInstance()
klass.getDeclaredConstructor().newInstance()
klass.getConstructor().newInstance()
NoSuchMethodException
因此,除非您知道构造函数是公共的,否则无法将其更改为
getConstructor()
。如果您需要访问不同级别的构造函数,getDeclaredConstructor是唯一的出路。不能使用getDeclaredConstructors吗()
(不是getDeclaredConstructor()
)根据您的逻辑获取所有构造函数并替换一个?正如弃用消息所说,与clazz.newInstance()
等价的代码是clazz.getDeclaredConstructor().newInstance()
。我假设这意味着,无论您在哪里成功使用clazz.newInstance()
,都可以用推荐的代码替换。如果您将clazz.newInstance()
替换为clazz.getConstructor().newInstance()
,您正在更改代码的语义。我还没有尝试过,但是如果零参数构造函数不是公共的,我也不希望clazz.newInstance()
工作-是吗??那么,如果使用clazz.getDeclaredConstructor().newInstance()
,在实践中会损失什么呢?@OleV.V。是的,Class.newInstance()
可用于非公共构造函数。但它需要您拥有正确的访问权限,否则它会抛出一个非法访问异常
(来自一些快速、非详尽的测试)。相关(关于它被弃用的原因):谢谢,所以抛出的任何异常都只会是有效的初始化失败?@user7294900是。
clazz.getDeclaredConstructor().newInstance()
return getConstructor0(parameterTypes, Member.DECLARED);
return getConstructor0(parameterTypes, Member.PUBLIC);