Я не знаю, почему никто не предоставил простое объяснение на основе примеров по сравнению, например, с Constructor::newInstance
, поскольку finally Class::newInstance
устарело с java-9.
Предположим, у вас есть очень простой класс (неважно, что он сломан):
static class Foo {
public Foo() throws IOException {
throw new IOException();
}
}
И вы пытаетесь создать его экземпляр с помощью отражения. Первый Class::newInstance
:
Class<Foo> clazz = ...
try {
clazz.newInstance();
} catch (InstantiationException e) {
// handle 1
} catch (IllegalAccessException e) {
// handle 2
}
Вызов этого приведет к выдаче IOException
- проблема в том, что ваш код не обрабатывает его, ни handle 1
, ни handle 2
его не поймают.
В отличие от этого при использовании Constructor
:
Constructor<Foo> constructor = null;
try {
constructor = clazz.getConstructor();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
try {
Foo foo = constructor.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
System.out.println("handle 3 called");
e.printStackTrace();
}
этот дескриптор 3 будет вызван, поэтому вы справитесь с этим.
Фактически Class::newInstance
обходит обработку исключений, которая вам действительно не нужна.
person
Eugene
schedule
26.10.2018