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