Почему это класс.newInstance() устарел в Java 9? [дубликат]
На этот вопрос уже есть ответ здесь:
- Почему класс.newInstance () "зло"? 2 ответа
Почему это класс.newInstance() устарел в Java 9?
Я читаю Javadoc 9:
Но я не уверен, что правильно понял его...Устарел. Этот метод распространяет любое исключение, вызванное конструктором nullary, включая проверенное исключение. Использование этот метод эффективно обходит проверку исключений во время компиляции, которая в противном случае была бы выполнена компилятором. конструктор.метод newInstance позволяет избежать этой проблемы путем обертывания любого исключения, вызванного конструктором, в (проверенное) исключение InvocationTargetException.
"распространяет любое исключение, вызванное нулевым конструктором " - разве это не правильно? Может быть, есть много моментов, которые я потерянный.
Edit вопрос, помеченный как повторяющиеся ответы, цитируя Javadoc, этот вопрос требует объяснения о Javadoc.
2 ответа:
Суть в том, что
newInstance()
не объявляетНикаких исключений, хотя нулевой конструктор рассматриваемого класса может выдавать проверенные исключения.
Он устарел в Java 9, но обратите внимание, что
Class.newInstance()
мог быть устарел раньше.
АльтернативаConstructor.newInstance()
не является новой вещью.
Метод
Class.newInstance()
распространяет проверенные исключения, которые по замыслу должны быть обработаны.
Вот объявлениеClass.newInstance()
:public T newInstance() throws InstantiationException, IllegalAccessException
Constructor.newInstance()
предоставляет способ обработки этих проверенных исключений со стороны клиента путем вызоваInvocationTargetException
:public T newInstance(Object... initargs) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException)
InvocationTargetException
является проверенным исключением. Он должен быть обрабатываемый.
И он предоставляет метод для извлечения исключения, вызванного конструктором:getTargetException()
.Предположим, что класс Foo с конструктором создает исключение проверки:
public class Foo{ public Foo() throws IOException { } }
С помощью
Constructor.newInstance()
клиенты, использующие отражение, теперь могут обрабатыватьInvocationTargetException
, которые могут быть брошены и обернуты брошенным исключением (во время выполнения или проверено).Например:
Constructor<Foo> constructor = ...; try{ Foo foo = constructor.newInstance(); } catch (InvocationTargetException e){ // handling the exception thrown by the constructor }
С
Class.newInstance()
, клиенты могут забыть / не обрабатыватьIOException
, так какClass.newInstance()
не бросает никаких проверенных исключение для его обработки:Class<Foo> clazz = Foo.class; Foo foo = clazz.newInstance();
Как следствие, исключение IOException, которое является проверяемым исключением, будет распространяться, в то время как код, который бросает его, никогда не эксплицирует его.