Почему Class.newInstance() "злой"?

Райан Делаччи задал здесь в комментарии № 3 до Ответ Тома Хотина:

почему Class.newInstance() "злой"?

это в ответ на образец кода:

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

так, почему это Зло?

Ответ 1

В документации по API Java объясняется, почему (http://java.sun.com/javase/6/docs/api/java/lang/Class.html#newInstance()):

Обратите внимание, что этот метод распространяется на любое исключение, созданное конструктором с нулевым значением, включая проверенное исключение. Использование этого метода эффективно обходит проверку исключения времени компиляции, которая в противном случае была бы выполнена компилятором. Метод Constructor.newInstance позволяет избежать этой проблемы, обернув любое исключение, созданное конструктором в (проверено) InvocationTargetException.

Другими словами, он может победить проверенную систему исключений.

Ответ 2

Еще одна причина:

Современные среды IDE позволяют находить использование классов - это помогает во время рефакторинга, если вы и ваша IDE знаете, какой код использует класс, который вы планируете изменить.

Если вы не используете явное использование конструктора, но вместо этого используете Class.newInstance(), вы рискуете не находить это использование во время рефакторинга, и эта проблема не проявится при компиляции.