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

Эти два вызова вызывают один и тот же конструктор, конструктор с нулевым аргументом:

  1. klass.newInstance()
  2. klass.getDeclaredConstructor().newInstance()

Оба выполняют одну и ту же проверку во время выполнения, чтобы проверить доступ вызывающей стороны, если конструктор не является общедоступным. Единственное отличие состоит в том, что # 2 оборачивает любые проверенные исключения вместо прямого выброса. В противном случае они идентичны, и вы можете заменить один другим.

Но это не так:

  1. klass.getConstructor().newInstance()

потому что он может вернуть только открытый конструктор. Выдает NoSuchMethodException, если конструктор не является общедоступным.

Таким образом, вы не можете изменить его на getConstructor(), если не знаете, что конструктор общедоступен.