Por que Class.newInstance () é “mal”?

Ryan Delucchi perguntou aqui no comentário # 3 à resposta de Tom Hawtin :

Por que é Class.newInstance () “mal”?

isso em resposta ao exemplo de código:

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

então, porque é o mal?

    A documentação da API Java explica por quê ( http://java.sun.com/javase/6/docs/api/java/lang/Class.html#newInstance () ):

    Observe que esse método propaga qualquer exceção lançada pelo construtor nulo, incluindo uma exceção verificada. O uso desse método efetivamente ignora a verificação de exceção em tempo de compilation que, de outra forma, seria executada pelo compilador. O método Constructor.newInstance evita esse problema envolvendo qualquer exceção lançada pelo construtor em uma InvocationTargetException (marcada).

    Em outras palavras, pode derrotar o sistema de exceções verificadas.

    Mais um motivo:

    Os IDEs modernos permitem que você encontre usos de class – isso ajuda durante a refatoração, se você e seu IDE souberem qual código está usando a class que você planeja alterar.

    Quando você não faz um uso explícito do construtor, mas usa Class.newInstance (), corre o risco de não encontrar esse uso durante a refatoração e esse problema não se manifestará quando você compilar.