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

瑞安DELUCCHI问这里的评论#3 汤姆Hawtin的回答是:


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


这是对代码示例的响应:


// Avoid Class.newInstance, for it is evil.

Constructor<? extends Runnable> ctor = runClass.getConstructor();

Runnable doRun = ctor.newInstance();

那么,为什么是邪恶的?


德玛西亚99
浏览 2185回答 3
3回答

心有法竹

另一个原因:现代化的IDE允许您查找类的用法-如果您和您的IDE知道正在使用什么代码打算使用要更改的类,则它在重构过程中会有所帮助。如果不对构造函数进行显式使用,而是改用Class.newInstance(),则可能会在重构过程中找不到这种用法,并且在编译时不会出现此问题。

陪伴而非守候

我不知道为什么没有人对此提供基于示例的简单解释,Constructor::newInstance例如,自从java-9 以来终于 Class::newInstance被弃用了。假设您有一个非常简单的类(与它是否损坏无关):static class Foo {&nbsp; &nbsp; public Foo() throws IOException {&nbsp; &nbsp; &nbsp; &nbsp; throw new IOException();&nbsp; &nbsp; }}您尝试通过反射创建它的实例。首先Class::newInstance:&nbsp; &nbsp; Class<Foo> clazz = ...&nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; clazz.newInstance();&nbsp; &nbsp; } catch (InstantiationException e) {&nbsp; &nbsp; &nbsp; &nbsp; // handle 1&nbsp; &nbsp; } catch (IllegalAccessException e) {&nbsp; &nbsp; &nbsp; &nbsp; // handle 2&nbsp; &nbsp; }调用它会导致IOException被抛出-问题是您的代码无法处理它,handle 1也handle 2不会捕获它。相比之下,通过Constructor:&nbsp; &nbsp; Constructor<Foo> constructor = null;&nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; constructor = clazz.getConstructor();&nbsp; &nbsp; } catch (NoSuchMethodException e) {&nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; }&nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; Foo foo = constructor.newInstance();&nbsp; &nbsp; } catch (InstantiationException e) {&nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; } catch (IllegalAccessException e) {&nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; } catch (InvocationTargetException e) {&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("handle 3 called");&nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; }该句柄3将被调用,因此您将对其进行处理。有效地,Class::newInstance绕过了异常处理-您真正不想要的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java