Почему класс?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 его.