2008-10-12 127 views
82

Ryan Delucchi問評論#3 hereTom Hawtin的回答是:爲什麼Class.newInstance()「邪惡」?

爲什麼Class.newInstance() 「惡」?

這個響應代碼示例:

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

那麼,爲什麼是邪惡?

+9

實際上看到了這個問題的答案:人們可以對反射的各種用法進行說明...不僅僅是Class.newInstance()。所以這實際上是一個普遍的觀察,即「反射會影響編譯時間檢查」......這往往是反思的一點。 – 2008-10-24 23:33:44

+23

孩子們這些天,哦,他們扔掉單詞「邪惡」,但他們甚至從來沒有見過COBOL或FORTRAN計劃!你想讓「EVIL」看看20年前的FORTRAN程序,這個程序是通過模擬背景和沒有CS影響力從項目傳遞給項目的!現在「EVIL!」 – NoMoreZealots 2009-07-31 01:50:05

+0

另請參閱http://stackoverflow.com/q/36272566/3888450 – 2016-03-28 23:14:30

回答

71

的Java API文檔解釋了爲什麼(http://java.sun.com/javase/6/docs/api/java/lang/Class.html#newInstance()):

注意,此方法傳播由null構造,包括檢查的異常拋出的任何異常。使用此方法可以有效繞過編譯時異常檢查,否則編譯器會執行該異常。 Constructor.newInstance方法通過將構造函數拋出的任何異常包裝在(checked)InvocationTargetException中來避免此問題。

換句話說,它可以打敗檢查的異常系統。

18

一個原因:

現代IDE讓你找到一流的用法 - 重構過程中有幫助,如果你和你的IDE知道什麼代碼是使用你打算改變其等級。

如果您沒有明確使用構造函數,而是使用Class.newInstance()代替,則在重構過程中您將無法找到該用法,並且在編譯時不會出現此問題。