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