<dfn id="w48us"></dfn><ul id="w48us"></ul>
  • <ul id="w48us"></ul>
  • <del id="w48us"></del>
    <ul id="w48us"></ul>
  • Java的內(nèi)省與反射

    時間:2024-06-19 12:06:41 SUN認(rèn)證 我要投稿
    • 相關(guān)推薦

    關(guān)于Java的內(nèi)省與反射

      很多同學(xué)在深入的接觸Java語言后就會發(fā)現(xiàn)這樣兩個詞:反射(Reflection)和內(nèi)省(Introspector),經(jīng)常搞不清楚這到底是怎么回事,在什么場合下應(yīng)用以及如何使用?下面YJBYS小編為大家整理了關(guān)于Java的內(nèi)省與反射的文章,希望對你有所幫助。

      內(nèi)省

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

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


    /*    
    *Createdon2004-6-29    
    */    
      
    packagedemo;    
      
    importjava.beans.BeanInfo;    
    importjava.beans.Introspector;    
    importjava.beans.PropertyDescriptor;    
      
    publicclassIntrospectorDemo{    
    Stringname;    
    publicstaticvoidmain(String[]args)throwsException{    
    IntrospectorDemodemo=newIntrospectorDemo();    
    demo.setName("WinterLau");    
      
    //如果不想把父類的屬性也列出來的話,    
    //那getBeanInfo的第二個參數(shù)填寫父類的信息    
    BeanInfobi=Introspector.getBeanInfo(demo.getClass(),Object.class);    
    PropertyDescriptor[]props=bi.getPropertyDescriptors();    
    for(inti=0;i<props.length;i++){    
    System.out.println(props[i].getName()+"="+    
    props[i].getReadMethod().invoke(demo,null));    
    }    
      
    }    
      
    publicStringgetName(){    
    returnname;    
    }    
      
    publicvoidsetName(Stringname){    
    this.name=name;    
    }    
    }  

      反射

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


    //通過類名來構(gòu)造一個類的實(shí)例    
    ClassClasscls_str=Class.forName("java.lang.String");    
    //上面這句很眼熟,因?yàn)槭褂眠^JDBC訪問數(shù)據(jù)庫的人都用過J    
    Objectstr=cls_str.newInstance();    
    //相當(dāng)于Stringstr=newString();    
      
    //通過方法名來調(diào)用一個方法    
    StringmethodName="length";    
    Methodm=cls_str.getMethod(methodName,null);    
    System.out.println("lengthis"+m.invoke(str,null));    
    //相當(dāng)于System.out.println(str.length()); 

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

    【Java的內(nèi)省與反射】相關(guān)文章:

    JAVA認(rèn)證基礎(chǔ)知識:基于反射機(jī)制的服務(wù)代理調(diào)用03-08

    2016年JAVA認(rèn)證基礎(chǔ)知識:基于反射機(jī)制的服務(wù)代理調(diào)用03-03

    學(xué)習(xí)Java的技巧03-05

    java習(xí)題及答案03-26

    JAVA認(rèn)證簡介03-19

    關(guān)于Java的import03-16

    Java入門基礎(chǔ)知識:Java IO(輸入/輸出)03-07

    JAVA認(rèn)證開源技術(shù):關(guān)于Java的對象equals方法03-04

    sun認(rèn)證java程序員須知Java日志框架03-30

    主站蜘蛛池模板: 在线精品国产一区二区三区 | 2024最新国产精品一区| 精品午夜国产人人福利| 国产麻豆精品一区二区三区v视界| 91精品视频观看| 精品国产a∨无码一区二区三区| 精品久久人人爽天天玩人人妻| 国产短视频精品一区二区三区| 无码精品蜜桃一区二区三区WW| 免费视频精品一区二区三区| 亚洲AV永久青草无码精品| 国产微拍精品一区二区| 精品福利一区二区三| 乱色精品无码一区二区国产盗| 久久久久久青草大香综合精品| 欧美日激情日韩精品| 国产精品高清一区二区三区| 亚洲国产精品自产在线播放| 国产午夜精品理论片| 伊人久久大香线蕉精品| 97精品国产福利一区二区三区| 亚洲国产精品久久久天堂| 国产精品1024视频| 久久青草国产精品一区| 国产精品人人爽人人做我的可爱| 亚洲精品黄色视频在线观看免费资源 | 亚洲精品亚洲人成在线观看| 精品99又大又爽又硬少妇毛片 | 国产精品黄页免费高清在线观看| 国产产无码乱码精品久久鸭| 三上悠亚久久精品| 亚洲精品无码久久久久| 亚洲精品无码永久在线观看 | 2021精品国产综合久久| 奇米影视7777久久精品| 亚洲精品无码乱码成人| 亚洲无线观看国产精品| 影院无码人妻精品一区二区| 精品一区二区三区在线观看| 国产精品 综合 第五页| 国产精品自在线拍国产电影|