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

2022-08-31 10:25:08

Ryan Delucchi在评论#3中对Tom Hawtin的回答提出了问题:

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

这是对代码示例的响应:

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

那么,为什么它是邪恶的呢?


答案 1

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

请注意,此方法传播 null 构造函数引发的任何异常,包括已检验的异常。使用此方法可有效地绕过编译时异常检查,否则编译器将执行该检查。该方法通过将构造函数引发的任何异常包装在(选中)中来避免此问题。Constructor.newInstanceInvocationTargetException

换句话说,它可以击败已检查的异常系统。


答案 2

还有一个原因:

现代 IDE 允许您查找类用法 - 如果您和您的 IDE 知道哪些代码正在使用您计划更改的类,则在重构期间会很有帮助。

如果不显式使用构造函数,而是使用 Class.newInstance(),则有可能在重构过程中找不到该用法,并且此问题在编译时不会显现出来。