Java 9 заменяет Class.newInstance
Class.newInstance устарел в Java 9:
clazz.newInstance()
можно заменить на
clazz.getDeclaredConstructor().newInstance()
Проблема в том, что getDeclaredConstructor возвращает любой конструктор без учета уровня доступа.
Если я хочу заменить все вхождения в моем коде (на разные пакеты/уровень доступа), я должен использовать getConstructor, чтобы получить открытый конструктор?
объект Constructor открытого конструктора, который соответствует указанному параметру типа
Или я не могу массово заменить все вхождения, потому что это необходимо для каждого случая (если существует открытый конструктор и/или если у меня есть правильный уровень доступа для класса)?
РЕДАКТИРОВАТЬ
getDeclaredConstructor:
return getConstructor0(parameterTypes, Member.DECLARED);
getConstructor:
return getConstructor0(parameterTypes, Member.PUBLIC);
Ответы
Ответ 1
Эти два вызова вызывают один и тот же конструктор, конструктор с нулевым аргументом:
klass.newInstance()
klass.getDeclaredConstructor().newInstance()
Оба выполняют одну и ту же проверку во время выполнения, чтобы проверить доступ вызывающей стороны, если конструктор не является общедоступным. Единственное отличие состоит в том, что # 2 оборачивает любые проверенные исключения вместо прямого выброса. В противном случае они идентичны, и вы можете заменить один другим.
Но это не так:
klass.getConstructor().newInstance()
потому что он может вернуть только открытый конструктор. Выдает NoSuchMethodException
, если конструктор не является общедоступным.
Таким образом, вы не можете изменить его на getConstructor()
, если не знаете, что конструктор общедоступен.