日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

查看Java Reflection類內(nèi)部情況 - Builder開發(fā)者在線

 linjisong 2007-09-30

查看Java Reflection類內(nèi)部情況

開發(fā)者在線 Builder.com.cn 更新時(shí)間:2006-12-10作者:Builder.com.cn 來(lái)源:

本文關(guān)鍵詞: Java

Java 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ì)象或類,并發(fā)現(xiàn)其成員、超類、實(shí)現(xiàn)的接口,然后盡可能地使用被發(fā)現(xiàn)的元素。
  • 按名字使用指以一個(gè)元素的符號(hào)名開始,并使用已命名的元素。

通常,探索方法以一個(gè)對(duì)象開始,并通過(guò)調(diào)用Object.getClass()方法獲得對(duì)象的類。類對(duì)象有很多方法發(fā)現(xiàn)類的內(nèi)容。以下是部分方法:

  • getMethods():返回一組表示類或接口的所有公共方法的方法對(duì)象數(shù)組。
  • getConstructors():返回一組表示類的所有公共構(gòu)造器的構(gòu)造器對(duì)象數(shù)組。
  • getFields():返回一組表示類或接口所有公共字段的字段對(duì)象數(shù)組。
  • getClasses():返回一組表示所有屬于類或接口的公共類和接口(例如,內(nèi)部類)的類對(duì)象數(shù)組。
  • getSuperclass():返回表示類或接口的超類的類對(duì)象(接口返回為空值)。
  • getInterfaces():返回一組表示類或接口執(zhí)行的所有接口的類對(duì)象數(shù)組。

你可以通過(guò)探索,即應(yīng)用類字面(如MyClass.class)或使用類名(如Class.forName("mypackage.MyClass"))獲得類對(duì)象。有了類對(duì)象,成員對(duì)象方法、構(gòu)造器或字段可以通過(guò)使用成員的符號(hào)名獲得。以下是最重要的一些技術(shù):

  • getMethod("methodName", Class...):返回表示接受類參數(shù)指定參數(shù)的類或接口中名為“methodName”的公共方法的方法對(duì)象。
  • getConstructor(Class...):返回表示接受類參數(shù)指定參數(shù)的類公共構(gòu)造器的構(gòu)造器對(duì)象。
  • getField("fieldName"):返回表示類或接口中名為“fieldname”的公共字段的字段對(duì)象。

你可以使用Method、Constructor和Field(字段)對(duì)象動(dòng)態(tài)地訪問(wèn)類表示成員。例如:

  • Field.get(Object):返回一個(gè)包含輸入get()對(duì)象實(shí)例的字段值對(duì)象。(如果字段對(duì)象表示靜態(tài)字段,那么對(duì)象參數(shù)便被忽略,也可能為空。)
  • Method.invoke(Object, Object...):返回一個(gè)包含為輸入invoke()的第一個(gè)對(duì)象參數(shù)實(shí)例調(diào)用方法的結(jié)果的對(duì)象。其余對(duì)象參數(shù)被傳遞給輸入方法。(如果方法對(duì)象表示一個(gè)靜態(tài)方法,那么第一個(gè)對(duì)象參數(shù)便被忽略,也可能為空。)
  • Constructor.newInstance(Object...):返回調(diào)用構(gòu)造器的新對(duì)象實(shí)例。對(duì)象參數(shù)輸入構(gòu)造器。(注意類的無(wú)參數(shù)構(gòu)造器也可以通過(guò)newInstance()被調(diào)用。)

創(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é)果。

更多閱讀參考

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多