飛艷小屋

          程序--人生--哲學(xué)___________________歡迎艷兒的加入

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            52 Posts :: 175 Stories :: 107 Comments :: 0 Trackbacks

          Java中的類反射機(jī)制

          (轉(zhuǎn)載)Java中的類反射機(jī)制

          ?

          一、反射的概念?:
          反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測(cè)和修改它本身狀態(tài)或行為的一種能力。這一概念的提出很快引發(fā)了計(jì)算機(jī)科學(xué)領(lǐng)域關(guān)于應(yīng)用反射性的研究。它首先被程序語言的設(shè)計(jì)領(lǐng)域所采用,并在Lisp和面向?qū)ο蠓矫嫒〉昧顺煽?jī)。其中LEAD/LEAD++?、OpenC++?、MetaXa和OpenJava等就是基于反射機(jī)制的語言。最近,反射機(jī)制也被應(yīng)用到了視窗系統(tǒng)、操作系統(tǒng)和文件系統(tǒng)中。?

          反射本身并不是一個(gè)新概念,它可能會(huì)使我們聯(lián)想到光學(xué)中的反射概念,盡管計(jì)算機(jī)科學(xué)賦予了反射概念新的含義,但是,從現(xiàn)象上來說,它們確實(shí)有某些相通之處,這些有助于我們的理解。在計(jì)算機(jī)科學(xué)領(lǐng)域,反射是指一類應(yīng)用,它們能夠自描述和自控制。也就是說,這類應(yīng)用通過采用某種機(jī)制來實(shí)現(xiàn)對(duì)自己行為的描述(self-representation)和監(jiān)測(cè)(examination),并能根據(jù)自身行為的狀態(tài)和結(jié)果,調(diào)整或修改應(yīng)用所描述行為的狀態(tài)和相關(guān)的語義。可以看出,同一般的反射概念相比,計(jì)算機(jī)科學(xué)領(lǐng)域的反射不單單指反射本身,還包括對(duì)反射結(jié)果所采取的措施。所有采用反射機(jī)制的系統(tǒng)(即反射系統(tǒng))都希望使系統(tǒng)的實(shí)現(xiàn)更開放。可以說,實(shí)現(xiàn)了反射機(jī)制的系統(tǒng)都具有開放性,但具有開放性的系統(tǒng)并不一定采用了反射機(jī)制,開放性是反射系統(tǒng)的必要條件。一般來說,反射系統(tǒng)除了滿足開放性條件外還必須滿足原因連接(Causally-connected)。所謂原因連接是指對(duì)反射系統(tǒng)自描述的改變能夠立即反映到系統(tǒng)底層的實(shí)際狀態(tài)和行為上的情況,反之亦然。開放性和原因連接是反射系統(tǒng)的兩大基本要素。13700863760

          Java中,反射是一種強(qiáng)大的工具。它使您能夠創(chuàng)建靈活的代碼,這些代碼可以在運(yùn)行時(shí)裝配,無需在組件之間進(jìn)行源代表鏈接。反射允許我們?cè)诰帉懪c執(zhí)行時(shí),使我們的程序代碼能夠接入裝載到JVM中的類的內(nèi)部信息,而不是源代碼中選定的類協(xié)作的代碼。這使反射成為構(gòu)建靈活的應(yīng)用的主要工具。但需注意的是:如果使用不當(dāng),反射的成本很高。

          二、Java中的類反射:
          Reflection?是?Java?程序開發(fā)語言的特征之一,它允許運(yùn)行中的?Java?程序?qū)ψ陨磉M(jìn)行檢查,或者說“自審”,并能直接操作程序的內(nèi)部屬性。Java?的這一能力在實(shí)際應(yīng)用中也許用得不是很多,但是在其它的程序設(shè)計(jì)語言中根本就不存在這一特性。例如,Pascal、C?或者?C++?中就沒有辦法在程序中獲得函數(shù)定義相關(guān)的信息。

          1.檢測(cè)類:

          1.1?reflection的工作機(jī)制

          考慮下面這個(gè)簡(jiǎn)單的例子,讓我們看看?reflection?是如何工作的。

          import?java.lang.reflect.*;
          public?class?DumpMethods?{
          ????public?static?void?main(String?args[])?{
          ????????try?{
          ????????????Class?c?=?Class.forName(args[0]);
          ????????????Method?m[]?=?c.getDeclaredMethods();
          ????????????for?(int?i?=?0;?i?<?m.length;?i++)
          ????????????????System.out.println(m[i].toString());
          ????????}?catch?(Throwable?e)?{
          ????????????System.err.println(e);
          ????????}
          ????}
          }

          按如下語句執(zhí)行:

          java?DumpMethods?java.util.Stack

          它的結(jié)果輸出為:

          public?java.lang.Object?java.util.Stack.push(java.lang.Object)

          public?synchronized?java.lang.Object?java.util.Stack.pop()

          public?synchronized?java.lang.Object?java.util.Stack.peek()

          loading...
          posted on 2006-09-01 16:02 天外飛仙 閱讀(330) 評(píng)論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 台北市| 商南县| 昭苏县| 翁牛特旗| 科尔| 玉树县| 承德县| 沐川县| 密山市| 茶陵县| 永和县| 和田市| 大田县| 富平县| 永新县| 新化县| 滦平县| 陕西省| 哈巴河县| 寿宁县| 沂源县| 瓮安县| 称多县| 项城市| 滁州市| 开封市| 许昌市| 汝阳县| 咸阳市| 武隆县| 沙坪坝区| 色达县| 海盐县| 临汾市| 彝良县| 汉源县| 同江市| 汕尾市| 育儿| 瑞昌市| 横山县|