<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    licheng700

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      26 Posts :: 5 Stories :: 5 Comments :: 1 Trackbacks

    很多朋友在深入的接觸JAVA語言后就會(huì)發(fā)現(xiàn)這樣兩個(gè)詞:反射(Reflection)和內(nèi)省(Introspector),經(jīng)常搞不清楚這到底是怎么回事,在什么場(chǎng)合下應(yīng)用以及如何使用?今天把這二者放在一起介紹,因?yàn)樗鼈兌呤窍噍o相成的。

    反射

    相對(duì)而言,反射比內(nèi)省更容易理解一點(diǎn)。用一句比較白的話來概括,反射就是讓你可以通過名稱來得到對(duì)象(類,屬性,方法)的技術(shù)。例如我們可以通過類名來生成一個(gè)類的實(shí)例;知道了方法名,就可以調(diào)用這個(gè)方法;知道了屬性名就可以訪問這個(gè)屬性的值。

    還是寫兩個(gè)例子讓大家更直觀的了解反射的使用方法:

    //通過類名來構(gòu)造一個(gè)類的實(shí)例
    Class cls_str = Class.forName("java.lang.String");
    //上面這句很眼熟,因?yàn)槭褂眠^JDBC訪問數(shù)據(jù)庫的人都用過J
    Object str = cls_str.newInstance();
    //相當(dāng)于 String str = new String();

    //通過方法名來調(diào)用一個(gè)方法
    String methodName = "length";
    Method m = cls_str.getMethod(methodName,null);
    System.out.println("length is " + m.invoke(str,null));
    //相當(dāng)于System.out.println(str.length());

    上面的兩個(gè)例子是比較常用方法。看到上面的例子就有人要發(fā)問了:為什么要這么麻煩呢?本來一條語句就完成的事情干嗎要整這么復(fù)雜?沒錯(cuò),在上面的例子中確實(shí)沒有必要這么麻煩。不過你想像這樣一個(gè)應(yīng)用程序,它支持動(dòng)態(tài)的功能擴(kuò)展,也就是說程序不重新啟動(dòng)但是可以自動(dòng)加載新的功能,這個(gè)功能使用一個(gè)具體類來表示。首先我們必須為這些功能定義一個(gè)接口類,然后我們要求所有擴(kuò)展的功能類必須實(shí)現(xiàn)我指定的接口,這個(gè)規(guī)定了應(yīng)用程序和可擴(kuò)展功能之間的接口規(guī)則,但是怎么動(dòng)態(tài)加載呢?我們必須讓應(yīng)用程序知道要擴(kuò)展的功能類的類名,比如是test.Func1,當(dāng)我們把這個(gè)類名(字符串)告訴應(yīng)用程序后,它就可以使用我們第一個(gè)例子的方法來加載并啟用新的功能。這就是類的反射,請(qǐng)問你有別的選擇嗎?

           關(guān)于方法的反射建議大家看我的另外一篇文章《利用Turbine的事件映射來擴(kuò)展Struts的功能》,地址是:http://www.javayou.com/article/CSDN/extend_struts.html。這篇文章詳細(xì)介紹了如果通過反射來擴(kuò)展Struts框架的功能。

    內(nèi)省

    內(nèi)省是Java語言對(duì)Bean類屬性、事件的一種缺省處理方法。例如類A中有屬性name,那我們可以通過getName,setName來得到其值或者設(shè)置新的值。通過getName/setName來訪問name屬性,這就是默認(rèn)的規(guī)則。Java中提供了一套API用來訪問某個(gè)屬性的getter/setter方法,通過這些API可以使你不需要了解這個(gè)規(guī)則(但你最好還是要搞清楚),這些API存放于包java.beans中。

    一般的做法是通過類Introspector來獲取某個(gè)對(duì)象的BeanInfo信息,然后通過BeanInfo來獲取屬性的描述器(PropertyDescriptor),通過這個(gè)屬性描述器就可以獲取某個(gè)屬性對(duì)應(yīng)的getter/setter方法,然后我們就可以通過反射機(jī)制來調(diào)用這些方法。下面我們來看一個(gè)例子,這個(gè)例子把某個(gè)對(duì)象的所有屬性名稱和值都打印出來:

    /* 
     * Created on 2004-6-29
     */

    package demo;

    import java.beans.BeanInfo;
    import java.beans.Introspector;
    import java.beans.PropertyDescriptor;

    /**
     * 內(nèi)省演示例子
     * @author liudong
     */

    public class IntrospectorDemo {
        String name;
        public static void main(String[] args) throws Exception{
            IntrospectorDemo demo = new IntrospectorDemo();
            demo.setName("Winter Lau");       

            //如果不想把父類的屬性也列出來的話,
            //getBeanInfo的第二個(gè)參數(shù)填寫父類的信息
            BeanInfo bi = Introspector.getBeanInfo(demo.getClass(),Object.class);
            PropertyDescriptor[] props = bi.getPropertyDescriptors();
            for(int i=0;i<props.length;i++){
                System.out.println(props[i].getName()+"="+
                        props[i].getReadMethod().invoke(demo,null));
            }

        }   

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

    Web開發(fā)框架Struts中的FormBean就是通過內(nèi)省機(jī)制來將表單中的數(shù)據(jù)映射到類的屬性上,因此要求FormBean的每個(gè)屬性要有getter/setter方法。但也并不總是這樣,什么意思呢?就是說對(duì)一個(gè)Bean類來講,我可以沒有屬性,但是只要有getter/setter方法中的其中一個(gè),那么Java的內(nèi)省機(jī)制就會(huì)認(rèn)為存在一個(gè)屬性,比如類中有方法setMobile,那么就認(rèn)為存在一個(gè)mobile的屬性,這樣可以方便我們把Bean類通過一個(gè)接口來定義而不用去關(guān)系具體實(shí)現(xiàn),不用去關(guān)系Bean中數(shù)據(jù)的存儲(chǔ)。比如我們可以把所有的getter/setter方法放到接口里定義,但是真正數(shù)據(jù)的存取則是在具體類中去實(shí)現(xiàn),這樣可提高系統(tǒng)的擴(kuò)展性。

    總結(jié)

    Java的反射以及內(nèi)省應(yīng)用到程序設(shè)計(jì)中去可以大大的提供程序的智能化和可擴(kuò)展性。有很多項(xiàng)目都是采取這兩種技術(shù)來實(shí)現(xiàn)其核心功能,例如我們前面提到的Struts,還有用于處理XML文件的Digester項(xiàng)目,其實(shí)應(yīng)該說幾乎所有的項(xiàng)目都或多或少的采用這兩種技術(shù)。在實(shí)際應(yīng)用過程中二者要相互結(jié)合方能發(fā)揮真正的智能化以及高度可擴(kuò)展性。

    posted on 2005-08-15 08:39 小海船 閱讀(229) 評(píng)論(0)  編輯  收藏

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲黄色在线电影| 日本亚洲中午字幕乱码| 午夜宅男在线永久免费观看网| 中文字幕亚洲综合久久综合| 亚洲Aⅴ无码一区二区二三区软件| 黄网站色视频免费在线观看的a站最新| 亚洲精品国产啊女成拍色拍| 在线观看免费亚洲| 日韩免费在线观看视频| 日本无卡码免费一区二区三区| 无码人妻一区二区三区免费视频 | 国产成人免费手机在线观看视频| 一级毛片免费全部播放| 亚洲日韩中文字幕| 免费人成年激情视频在线观看| 99re这里有免费视频精品 | 国产亚洲中文日本不卡二区| 亚洲欧洲中文日韩久久AV乱码| 一级做a免费视频观看网站| 中文字幕亚洲综合精品一区| 国产精品无码一二区免费| 久久国产乱子伦精品免费看| 美女一级毛片免费观看| 久久久久亚洲AV无码观看| 亚洲成a人片在线观看久| 全免费毛片在线播放| 成人av片无码免费天天看| 亚洲精品乱码久久久久蜜桃| 免费一级毛片在线播放| 97国产免费全部免费观看| 在线观看免费无码视频| 国产偷国产偷亚洲高清在线| 亚洲天堂免费在线视频| 69成人免费视频无码专区| 特级毛片免费播放| 国产精品亚洲片夜色在线| 免费大片在线观看网站| 国产麻豆视频免费观看| 免费A级毛片无码视频| AAAAA级少妇高潮大片免费看 | 一级毛片免费视频|