Почему это класс.newInstance() устарел в Java 9? [дубликат]


На этот вопрос уже есть ответ здесь:

Почему это класс.newInstance() устарел в Java 9?

Я читаю Javadoc 9:

Устарел. Этот метод распространяет любое исключение, вызванное конструктором nullary, включая проверенное исключение. Использование этот метод эффективно обходит проверку исключений во время компиляции, которая в противном случае была бы выполнена компилятором. конструктор.метод newInstance позволяет избежать этой проблемы путем обертывания любого исключения, вызванного конструктором, в (проверенное) исключение InvocationTargetException.

Но я не уверен, что правильно понял его...

"распространяет любое исключение, вызванное нулевым конструктором " - разве это не правильно? Может быть, есть много моментов, которые я потерянный.

Edit вопрос, помеченный как повторяющиеся ответы, цитируя Javadoc, этот вопрос требует объяснения о Javadoc.

2 8

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, которое является проверяемым исключением, будет распространяться, в то время как код, который бросает его, никогда не эксплицирует его.