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);
答案 0 :(得分:8)
Class.newInstance()
调用零参数构造函数,无论它是否是公共的。它对调用者对该构造函数的访问进行运行时检查。
调用getDeclaredConstructor()
将返回相同的构造函数。调用getDeclaredConstructor().newInstance()
执行相同的运行时检查。除了对异常的不同处理之外,它执行相同的操作。
否,请勿将其更改为getConstructor()
。对于非公共构造函数,这将导致NoSuchMethodException
。