Я не знаю, почему никто не предоставил простое объяснение, основанное на примере, по сравнению с, например, Constructor::newInstance
, так как окончательно 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
обходит обработку исключений - что вам действительно не нужно.