Почему класс?newInstance () устарел в Java 9? [дубликат]
этот вопрос уже есть ответ здесь:
- Почему класс.newInstance () "зло"? 2 ответы
почему класс.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 его.