1. 程式人生 > >java中的反射 1—— 簡介@譯自Oracle官方文件

java中的反射 1—— 簡介@譯自Oracle官方文件

反射API的使用

反射通常被用在需要檢查或修改其他執行在JVM中的程式的執行時行為的程式中。這是一種高階特性所以只建議對Java語言基礎有深刻理解的開發人員使用。請牢記這個忠告,反射是一種強大的技術,它使得程式可以完成用其他手段不可能完成的任務。

可擴充套件性
程式可以通過使用類的完全限定名稱(fully-qualified name)建立可擴充套件物件的例項來使用外部的或使用者自定義的類。
類瀏覽器(Class Browser)和視覺化開發環境
類瀏覽器需要有能力列舉類的數目。視覺化開發環境可以藉助使用反射獲取到的型別資訊幫助開發人員寫出正確的程式碼
偵錯程式(Debuggers)和測試工具
偵錯程式需要有能力檢查類中的私有(private)成員。自動化測試框架可以使用反射有組織地呼叫一個類的API以保證在測試中受測試程式碼被全面覆蓋。

反射的缺點

反射是強大的,但卻不應該隨意使用。如果可以不使用反射而達到同樣的效果那就不要用反射。使用反射時以下幾點需牢記於心。

浪費效能
因為反射參與了動態處理的型別,所以JVM的一些優化措施會失效。所造成的後果便是,反射操作比不用反射的情況會有較差的效能,因此在對效能有要求的程式碼中應儘量避免使用。
安全性受限
反射需要執行時許可權所以不能執行在安全管理器(security manager)下。這在對執行環境安全有較高要求時,比如Applet,尤其需要注意。
暴露內部結構
由於反射允許執行一些在不使用反射時會被視為非法(illeagal)的操作,比如訪問私有(private)成員和方法,所以使用反射會造成意想不到的副作用(sede-effects),可能會造成程式碼功能異常或者喪失可移植性。反射會破壞程式碼的抽象(abstraction)因此使用了反射的程式碼可能會在系統升級後表現異常。

詳細示例

示例涵蓋了使用反射訪問和操作類、欄位、方法和構造方法的常見用法。每個部分都有示例程式碼、提醒和常見問題的分析。

這部分展示了獲取一個Class物件的多種方式以及用該物件對類的各項屬性進行檢查,包括宣告和內容。
成員
這部分展示瞭如何使用反射API找出一個類的欄位、方法和構造方法。例子涵蓋了欄位值的設定和獲取,方法的呼叫以及使特定的構造方法建立物件的新例項。
陣列和列舉型別
這部分介紹了兩種特別的類:在執行時產生的陣列,以及定義了唯一物件名例項的列舉型別。示例程式碼展示瞭如何獲取一個數組的元素型別以及如何設定和獲得陣列或列舉型別中的欄位。
注意: 示例程式碼僅供學習反射API使用。因此對異常的處理與實際生產中的程式碼是不同的。尤其是在實際工作中不應該讓使用者看到異常丟擲的路徑。