原文地址; https://blog.csdn.net/hahalzb/article/details/5972421java
1).內省(Introspector)是Java 語言對Bean類屬性、事件的一種缺省處理方法。例如類 A 中有屬性 name, 那咱們能夠經過 getName,setName 來獲得其值或者設置新的值。經過 getName/setName 來訪問 name 屬性,這就是默認的規則。框架
Java 中提供了一套 API 用來訪問某個屬性的 getter/setter 方法,經過這些 API 可使你不須要了解這個規則(但你最好仍是要搞清楚),這些 API 存放於包 java.beans 中。工具
2).直接經過屬性的描述器java.beans.PropertyDescriptor類,來訪問屬性的getter/setter 方法;.net
相關代碼:設計
3).經過類 Introspector 來獲取某個對象的 BeanInfo 信息,而後經過 BeanInfo 來獲取屬性的描述器( PropertyDescriptor ),經過這個屬性描述器就能夠獲取某個屬性對應的 getter/setter 方法,而後咱們就能夠經過反射機制來調用這些方法。orm
相關代碼:
把2中的getProperty()修改爲以下形式:對象
4).咱們又一般把javabean的實例對象稱之爲值對象 (Value Object),由於這些bean中一般只有一些信息字段和存儲方法,沒有功能性方法。一個JavaBean類能夠不當JavaBean用,而當成普通類 用。JavaBean實際就是一種規範,當一個類知足這個規範,這個類就能被其它特定的類調用。一個類被看成javaBean使用時,JavaBean的 屬性是根據方法名推斷出來的,它根本看不到java類內部的成員變量(javabean的成員變量一般都是私有private的)。blog
5).除了反射用到的類須要引入外,內省須要引入的類以下所示,它們都屬於java.beans包中的類,本身寫程序的時候也不能忘了引入相應的包或者類。事件
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;ip
6).下面講解一些開源的工具類Beanutils,須要額外下載的,commons-beanutils.jar,要使用它還必須導入commons-logging.jar包,否則會出異常;
相關代碼一:
相關代碼二:
BeanUtils支持javabean屬性的級聯操做;
相關代碼三:
BeanUtils和PropertyUtils對比:
6).理解了相應的原理,那些現成的工具用起來就會更舒服,如Beanutils與 PropertyUtils工具。這兩個工具設置屬性的時候一個主要區別是PropertyUtils.getPropety方法得到的屬性值的類型爲該 屬性原本的類型,而BeanUtils.getProperty則是將該屬性的值轉換成字符串後才返回。
總結
Web 開發框架 Struts 中的 FormBean 就是經過內省機制來將表單中的數據映射到類的屬性上,所以要求 FormBean 的每一個屬性要有 getter/setter 方法。但也並不老是這樣,什麼意思呢?就是說對一個 Bean 類來說,我能夠沒有屬性,可是隻要有 getter/setter 方法中的其中一個,那麼 Java 的內省機制就會認爲存在一個屬性,好比類中有方法 setMobile ,那麼就認爲存在一個 mobile 的屬性。
將 Java 的反射以及內省應用到程序設計中去能夠大大的提供程序的智能化和可擴展性。有不少項目都是採起這兩種技術來實現其核心功能,例如咱們前面提到的 Struts ,還有用於處理 XML 文件的 Digester 項目,其實應該說幾乎全部的項目都或多或少的採用這兩種技術。在實際應用過程當中兩者要相互結合方能發揮真正的智能化以及高度可擴展性。--------------------- 做者:hahalzb 來源:CSDN 原文:https://blog.csdn.net/hahalzb/article/details/5972421 版權聲明:本文爲博主原創文章,轉載請附上博文連接!