Pourquoi Class.newInstance () est-il «méchant»?

Ryan Delucchi a demandé ici dans le commentaire # 3 à la réponse de Tom Hawtin :

pourquoi est Class.newInstance () “mal”?

ceci en réponse à l’exemple de code:

// Avoid Class.newInstance, for it is evil. Constructor ctor = runClass.getConstructor(); Runnable doRun = ctor.newInstance(); 

alors, pourquoi est-ce le mal?

    La documentation de l’API Java explique pourquoi ( http://java.sun.com/javase/6/docs/api/java/lang/Class.html#newInstance () ):

    Notez que cette méthode propage toute exception émise par le constructeur nullary, y compris une exception vérifiée. L’utilisation de cette méthode contourne efficacement la vérification des exceptions à la compilation qui serait effectuée par le compilateur. La méthode Constructor.newInstance évite ce problème en encapsulant toute exception émise par le constructeur dans une exception InvocationTargetException (cochée).

    En d’autres termes, il peut vaincre le système des exceptions vérifiées.

    Une raison de plus:

    Les IDE modernes vous permettent de trouver des utilisations de classes – cela aide pendant le refactoring, si vous et votre IDE savez quel code utilise la classe que vous prévoyez de changer.

    Lorsque vous ne faites pas une utilisation explicite du constructeur, mais utilisez Class.newInstance () à la place, vous risquez de ne pas trouver cette utilisation lors du refactoring et ce problème ne se manifestera pas lors de la compilation.