Je ne sais pas pourquoi personne n'a fourni d'explication simple basée sur un exemple, par rapport à la situation suivante Constructor::newInstance
par exemple, puisque enfin Class::newInstance
est déprécié depuis java-9.
Supposons que vous ayez cette classe très simple (peu importe qu'elle soit cassée) :
static class Foo {
public Foo() throws IOException {
throw new IOException();
}
}
Et vous essayez d'en créer une instance par réflexion. D'abord Class::newInstance
:
Class<Foo> clazz = ...
try {
clazz.newInstance();
} catch (InstantiationException e) {
// handle 1
} catch (IllegalAccessException e) {
// handle 2
}
L'appel de cette fonction entraînera un IOException
Le problème, c'est que votre code ne le gère pas. handle 1
ni handle 2
l'attrapera.
En revanche, lorsque vous le faites via un 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();
}
que la poignée 3 sera appelée, donc vous la traiterez.
Efficacement, Class::newInstance
contourne la gestion des exceptions - ce que vous ne voulez vraiment pas.
11 votes
En fait, en voyant les réponses à cette question, on pourrait dire cela à propos d'une variété d'utilisations de la réflexion ... pas seulement de Class.newInstance(). Il s'agit donc d'une observation générale selon laquelle "la réflexion fait échouer la vérification au moment de la compilation" ... ce qui est souvent le but de la réflexion.
25 votes
Les jeunes d'aujourd'hui, Oh oui, ils jettent autour du mot "EVIL" mais ils n'ont jamais vu un programme COBOL ou FORTRAN ! Si vous voulez du "MAUVAIS", jetez un coup d'oeil à un programme FORTRAN vieux de 20 ans qui a été passé d'un projet à l'autre par des bricoleurs ayant une formation en simulation et aucune influence CS ! Voilà qui est "MALIN" !
0 votes
Voir aussi stackoverflow.com/q/36272566/3888450