日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
深入理解Java的內(nèi)省與反射

很多朋友在深入的接觸Java語(yǔ)言后就會(huì)發(fā)現(xiàn)這樣兩個(gè)詞:反射和內(nèi)省,之前我們已經(jīng)通過(guò)實(shí)例解析了Java的反射機(jī)制,在什么場(chǎng)合下應(yīng)用以及如何使用?今天把這二者放在一起介紹,因?yàn)樗鼈兌呤窍噍o相成的。

反射

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

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

上面的兩個(gè)例子是比較常用方法。看到上面的例子就有人要發(fā)問(wèn)了:為什么要這么麻煩呢?本來(lái)一條語(yǔ)句就完成的事情干嗎要整這么復(fù)雜?沒(méi)錯(cuò),在上面的例子中確實(shí)沒(méi)有必要這么麻煩。不過(guò)你想像這樣一個(gè)應(yīng)用程序,它支持動(dòng)態(tài)的功能擴(kuò)展,也就是說(shuō)程序不重新啟動(dòng)但是可以自動(dòng)加載新的功能,這個(gè)功能使用一個(gè)具體類來(lái)表示。首先我們必須為這些功能定義一個(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è)例子的方法來(lái)加載并啟用新的功能。這就是類的反射,請(qǐng)問(wèn)你有別的選擇嗎?

內(nèi)省

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

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

 
 
 
  1. /*  
  2. *Createdon2004-6-29  
  3. */  
  4.  
  5. packagedemo;  
  6.  
  7. importjava.beans.BeanInfo;  
  8. importjava.beans.Introspector;  
  9. importjava.beans.PropertyDescriptor;  
  10.  
  11. publicclassIntrospectorDemo{  
  12. Stringname;  
  13. publicstaticvoidmain(String[]args)throwsException{  
  14. IntrospectorDemodemo=newIntrospectorDemo();  
  15. demo.setName("WinterLau");  
  16.  
  17. //如果不想把父類的屬性也列出來(lái)的話,  
  18. //那getBeanInfo的第二個(gè)參數(shù)填寫父類的信息  
  19. BeanInfobi=Introspector.getBeanInfo(demo.getClass(),Object.class);  
  20. PropertyDescriptor[]props=bi.getPropertyDescriptors();  
  21. for(inti=0;i
  22. System.out.println(props[i].getName()+"="+  
  23. props[i].getReadMethod().invoke(demo,null));  
  24. }  
  25.  
  26. }  
  27.  
  28. publicStringgetName(){  
  29. returnname;  
  30. }  
  31.  
  32. publicvoidsetName(Stringname){  
  33. this.name=name;  
  34. }  
  35. }  

Web開(kāi)發(fā)框架Struts中的FormBean就是通過(guò)內(nèi)省機(jī)制來(lái)將表單中的數(shù)據(jù)映射到類的屬性上,因此要求FormBean的每個(gè)屬性要有g(shù)etter/setter方法。但也并不總是這樣,什么意思呢?就是說(shuō)對(duì)一個(gè)Bean類來(lái)講,我可以沒(méi)有屬性,但是只要有g(shù)etter/setter方法中的其中一個(gè),那么Java的內(nèi)省機(jī)制就會(huì)認(rèn)為存在一個(gè)屬性,比如類中有方法setMobile,那么就認(rèn)為存在一個(gè)mobile的屬性,這樣可以方便我們把Bean類通過(guò)一個(gè)接口來(lái)定義而不用去關(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ù)來(lái)實(shí)現(xiàn)其核心功能,例如我們前面提到的Struts,還有用于處理XML文件的Digester項(xiàng)目,其實(shí)應(yīng)該說(shuō)幾乎所有的項(xiàng)目都或多或少的采用這兩種技術(shù)。在實(shí)際應(yīng)用過(guò)程中二者要相互結(jié)合方能發(fā)揮真正的智能化以及高度可擴(kuò)展性。

【編輯推薦】

  1. Java中利用反射實(shí)現(xiàn)類的動(dòng)態(tài)加載
  2. 關(guān)于Java反射機(jī)制的一個(gè)實(shí)例
  3. Java實(shí)例講解反射機(jī)制Reflection
  4. 使用Java 5特性來(lái)簡(jiǎn)化反射編程
  5. 反射在Java Swing編程中的應(yīng)用

本文名稱:深入理解Java的內(nèi)省與反射
瀏覽地址:http://m.5511xx.com/article/cdodccd.html