Java Reflection(反射)是一種在運行期間查看Java對象內部情況的技術,包括Java對象的變量、支持的方法、實現(xiàn)的接口、擴展的類——基本上在編譯時你能想知道的關于對象的任何東西。
Reflection API位于java.lang.reflect包中,在所有J2SE安裝程序中都有。它主要是為一些通用程序設計的,如數(shù)據庫瀏覽器或可視代碼編輯器,但是它可以被運用在其他任何應用軟件中。Reflection用于處理之前你所知甚少的類文件。反射需要很高的間接制造費用,所以在使用之前,你應該確定自己不能僅憑一個簡單的接口——Class.forName(),而要用一個委托對象。
實例
列表 A含有一個使用Reflection代碼的例子。列表A中的代碼與下列代碼等同:
newTestClass().setName("TestName");第一個例子中的代碼用反射動態(tài)地調用新建對象的方法。這使用起來相當方便,但相對較慢。
基本技巧
Reflection中包含了兩種基本的技術:探索和按名稱使用。以下是對兩種方法的描述:
通常,探索方法以一個對象開始,并通過調用Object.getClass()方法獲得對象的類。類對象有很多方法發(fā)現(xiàn)類的內容。以下是部分方法:
你可以通過探索,即應用類字面(如MyClass.class)或使用類名(如Class.forName("mypackage.MyClass"))獲得類對象。有了類對象,成員對象方法、構造器或字段可以通過使用成員的符號名獲得。以下是最重要的一些技術:
你可以使用Method、Constructor和Field(字段)對象動態(tài)地訪問類表示成員。例如:
創(chuàng)建數(shù)組和代理類
java.lang.reflect包提供一個數(shù)組,其中包含了可創(chuàng)建和操控數(shù)組對象的靜態(tài)方法。從J2SE 1.3開始,java.lang.reflect包還提供了一個代理類,它支持動態(tài)創(chuàng)建用來實現(xiàn)指定接口的代理類。
代理類的執(zhí)行由執(zhí)行InvocationHandler接口的一個補充對象完成。代理對象的每個調用方法調用InvocationHandler的方法調用(對象、方法、對象[])——第一參數(shù)是代理對象,第二參數(shù)是表示代理所執(zhí)行接口的方法的方法對象,而第三參數(shù)是輸入接口方法的參數(shù)數(shù)組。invoke()方法返回一個對象結果,其中包含返回調用代理接口方法的代碼的結果。
更多閱讀參考