成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入理解Java的內省與反射

開發 后端
很多朋友在深入的接觸Java語言后就會發現這樣兩個詞:反射(Reflection)和內省(Introspector),經常搞不清楚這到底是怎么回事,在什么場合下應用以及如何使用?

很多朋友在深入的接觸Java語言后就會發現這樣兩個詞:反射和內省,之前我們已經通過實例解析了Java的反射機制,在什么場合下應用以及如何使用?今天把這二者放在一起介紹,因為它們二者是相輔相成的。

反射

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

  1. //通過類名來構造一個類的實例  
  2. ClassClasscls_str=Class.forName("java.lang.String");  
  3. //上面這句很眼熟,因為使用過JDBC訪問數據庫的人都用過J  
  4. Objectstr=cls_str.newInstance();  
  5. //相當于Stringstr=newString();  
  6.  
  7. //通過方法名來調用一個方法  
  8. StringmethodName="length";  
  9. Methodm=cls_str.getMethod(methodName,null);  
  10. System.out.println("lengthis"+m.invoke(str,null));  
  11. //相當于System.out.println(str.length());  

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

內省

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

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

  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. //如果不想把父類的屬性也列出來的話,  
  18. //那getBeanInfo的第二個參數填寫父類的信息  
  19. BeanInfobi=Introspector.getBeanInfo(demo.getClass(),Object.class);  
  20. PropertyDescriptor[]props=bi.getPropertyDescriptors();  
  21. for(inti=0;i<props.length;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開發框架Struts中的FormBean就是通過內省機制來將表單中的數據映射到類的屬性上,因此要求FormBean的每個屬性要有getter/setter方法。但也并不總是這樣,什么意思呢?就是說對一個Bean類來講,我可以沒有屬性,但是只要有getter/setter方法中的其中一個,那么Java的內省機制就會認為存在一個屬性,比如類中有方法setMobile,那么就認為存在一個mobile的屬性,這樣可以方便我們把Bean類通過一個接口來定義而不用去關心具體實現,不用去關心Bean中數據的存儲。比如我們可以把所有的getter/setter方法放到接口里定義,但是真正數據的存取則是在具體類中去實現,這樣可提高系統的擴展性。

總結

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

【編輯推薦】

  1. Java中利用反射實現類的動態加載
  2. 關于Java反射機制的一個實例
  3. Java實例講解反射機制Reflection
  4. 使用Java 5特性來簡化反射編程
  5. 反射在Java Swing編程中的應用

 

責任編輯:王曉東 來源: 博客園
相關推薦

2024-06-28 10:25:18

2010-06-01 15:25:27

JavaCLASSPATH

2016-12-08 15:36:59

HashMap數據結構hash函數

2020-07-21 08:26:08

SpringSecurity過濾器

2024-03-15 15:03:23

2020-11-02 13:06:42

Java裝箱拆箱

2024-09-02 14:12:56

2010-05-27 15:05:23

ServletJava

2012-11-22 10:11:16

LispLisp教程

2018-07-09 15:11:14

Java逃逸JVM

2022-07-06 08:05:52

Java對象JVM

2024-01-09 08:28:44

應用多線程技術

2024-12-02 11:39:30

2017-05-04 16:35:45

2024-06-26 12:56:06

2025-01-20 00:00:00

反射Java語言

2023-10-19 11:12:15

Netty代碼

2021-02-17 11:25:33

前端JavaScriptthis

2009-09-25 09:14:35

Hibernate日志

2013-09-22 14:57:19

AtWood
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产男人的天堂 | 91人人在线 | 精品国产乱码久久久久久图片 | 欧美激情在线一区二区三区 | 在线观看亚洲精品 | 亚洲一区二区电影网 | 毛片免费视频 | 日本久久网| 日本精品一区二区 | 久久精品综合 | 久久久久国产精品 | 午夜影院网站 | 在线免费观看黄网 | 亚洲精品久久久久久首妖 | 成人精品久久 | 日韩色图在线观看 | 自拍偷拍视频网 | 亚洲天堂中文字幕 | 玖玖操| 成人精品免费视频 | 97国产在线观看 | 99久久久久久久久 | 精品国产一区二区三区日日嗨 | 91一区二区三区 | 天天成人综合网 | 日本中文字幕在线观看 | 999精品网 | 欧美日韩高清一区二区三区 | 中文字幕一级毛片 | 一区二区三区精品视频 | 韩国欧洲一级毛片 | 久久亚洲国产精品日日av夜夜 | 精品视频在线免费观看 | 午夜激情小视频 | 人人干人人草 | 888久久久 | 免费观看成人性生生活片 | 羞羞视频免费观 | 韩日免费视频 | 久久国产精品久久 | 国产激情在线 |