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

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

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

Я прочитал Javadoc 9:

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

но я не уверен,что понял это...

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

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

2 ответов


дело в том, что newInstance() не объявить любые исключения, хотя нулевой конструктор рассматриваемого класса может выдавать проверенные исключения.


он устарел в Java 9, но обратите внимание, что Class.newInstance() мог быть устаревшим раньше.
The 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 as Class.newInstance() не бросает никакого проверенного исключения для его обработки:

Class<Foo> clazz = Foo.class;
Foo foo = clazz.newInstance();

как следствие, исключение IOException, что проверенное исключение будет распространяться в то время как код, который бросает его, не explicits его.