为什么是Class.newInstance()“邪恶”?

Ryan Delucchi 在这里向Tom Hawtin的回答#3发表了评论:

为什么是Class.newInstance()“邪恶”?

这在响应代码示例:

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

那么,为什么是邪恶呢?

Java API文档解释了为什么( http://java.sun.com/javase/6/docs/api/java/lang/Class.html#newInstance(); ):

请注意,此方法传播由null构造函数抛出的任何exception,包括检查的exception。 这种方法的使用有效地绕过了编译时exception检查,否则将由编译器执行。 Constructor.newInstance方法通过将构造函数抛出的任何exception包装在(checked) InvocationTargetException避免此问题。

换句话说,它可以打败检查的exception系统。

还有一个原因:

现代的IDE允许你find类的用法 – 这有助于重构,如果你和你的IDE知道什么代码正在使用你打算改变的类。

如果不明确使用构造函数,而是使用Class.newInstance(),那么在重构过程中将不会find该用法,并且在编译时不会出现此问题。