我還爲創建使用反射的對象編寫了類似的計時測試程序,但這種情況下的差異不象字段和方法調用情況下那麼顯著。[color=darkred]使用 newInstance() 調用創建一個簡單的 java.lang.Object 實例耗用的時間大約是在Sun 1.3.1 JVM上使用 new Object() 的12倍,是在IBM 1.4.0 JVM的四倍,只是Sun 1.4.1 JVM上的兩倍。[/color]使用 Array.newInstance(type, size) 創建一個數組耗用的時間是任何測試的JVM上使用 new type[size] 的兩倍,隨着數組大小的增加,差異逐步縮小。
結束語
Java語言反射提供一種動態鏈接程序組件的多功能方法。它允許程序創建和控制任何類的對象(根據安全性限制),無需提前硬編碼目標類。這些特性使得反射特別適用於創建以非常普通的方式與對象協作的庫。例如,反射經常在持續存儲對象爲數據庫、XML或其它外部格式的框架中使用。
反射有兩個缺點。第一個是性能問題。當用於字段和方法接入時反射要遠慢於直接代碼。性能問題的程度取決於程序中是如何使用反射的。如果它作爲程序運行中相對很少涉及的部分,緩慢的性能將不會是一個問題。即使測試中最壞情況下的計時圖顯示的反射操作只耗用幾微秒。僅反射在性能關鍵的應用的核心邏輯中使用時性能問題才變得至關重要。
許多應用更嚴重的一個缺點是使用反射會模糊程序內部實際要發生的事情。程序人員希望在源代碼中看到程序的邏輯,反射等繞過了源代碼的技術會帶來維護問題。反射代碼比相應的直接代碼更復雜,正如性能比較的代碼實例中看到的一樣。解決這些問題的最佳方案是保守地使用反射-- 僅在它可以真正增加靈活性的地方 -- 記錄其在目標類中的使用。