Commons-Beanutils包詳解

jopen 12年前發布 | 79K 次閱讀 常用工具包 BeanUtils

Commons-Beanutils(一)

Commons-Beanutils 這個是jakarta commons項目中的一個子項目。這個項目開發的目的是幫助開發者動態的獲取/設值Java Bean的屬性,同時解決每次都要寫getXXX和setXXX的麻煩。

一、XXXConvert

這些類都實現Converter接口,提供把value值轉化成為相應XXX類的實現。現在只針對四種類型:數字,時間,Boolean和 String。在Converter 接口中只有一個方法convert(Class type, Object value),把value對象轉換為type所要求的類。XXXConvert類中這個方法的思路是:

1、如果value==null,并且自己內部有缺省的值那么就返回這個缺省的值。如果沒有缺省值,就拋出ConversionException異常。

2、如果value instanceOf XXX類,那么就直接返回value。

3、如果上面的都不行,那么調用new XXX(value.toString())或者XXX.valueOf(value.toString())方法來返回。轉化失敗時,拋出ConversionException異常。

二、特殊的實現

1、對于ClassConverter類,當進入第三種情形的時候,實際執行的是

ClassLoader classLoader =Thread.currentThread().getContextClassLoader();

if (classLoader == null) {

classLoader = ClassConverter.class.getClassLoader();

}

return (classLoader.loadClass(value.toString()));

2、對于BooleanConverter類,當進入第三種情形的時候,實際執行的是,根據value.toString()的值:yes,y,true, on, 1 返回true;no,n,false,off,0 返回false。如果這些情形都不符合,并且有缺省值的時候則返回缺省值。否則拋出ConversionException;

三、XXXArrayConverter

這些類繼承自AbstractArrayConverter類。 AbstractArrayConverter 實際只實現了一個List parseElements(String svalue)方法。這個方法接受的是{value1, value2,...}格式的字符串,逐個解析出來后,放入一個ArrayList中。它通過StreamTokenizer解析字符串:StreamTokenizer是用來分離input stream中讀取的字符串,并且可以根據標記區分不同的內容,比如數字,字符或者注釋。XXXArrayConverter由于要轉換的是一個數組,所以convert(....)方法的實現過程有所不同。

1、如果value==null,并且自己內部有缺省的值那么就返回這個缺省的值。如果沒有缺省值,就拋出ConversionException異常。

2、如果model.getClass() == value.getClass(),那么就直接返回value。

3、如果上面的都不行,那么就通過parseElements(value.toString())生成一個數組,再對數組的元素逐個調用new XXX(list.get(i))或者XXX.valueOf(list.get(i))方法,轉換成為數組對元素要求的類型。轉化失敗時,拋出 ConversionException異常。

Commons-Beanutils(二)

一、LocaleConverter 與 BaseLocaleConverter

LocaleConverter繼承自 Converter接口,定義了一個新方法convert(Class type, Object value, String pattern)。

抽象類BaseLocaleConverter實現了LocaleConverter接口。它的locPattern屬性用來表示這個對象的 pattern是否是本地化的格式。patttern 是指把何種格式的時間或者數字值轉換成標準值。convert(...)的執行過程是:

1、如果value==null,并且自己內部有缺省的值那么就返回這個缺省的值。如果沒有缺省值,就拋出ConversionException異常。

2、根據參數pattern值是否為null,調用parse(Object value, String pattern)方法:如果這個參數不為null那么就使用這個參數的值,否則使用對象預存的pattern值。如果這

樣做引起了異常,會首先判斷是否能夠返回缺省的值,不能則拋出ConversionException異常。

3、parse(Object value, String

pattern)方法的實現被拋至繼承了它的類具體實現。這個方法雖然把value值表述為Object類型,但是最后都是通過強制轉換,轉換成為String類型。也就是說它實際上需要的

是String類型的value。

二、 XXXLocaleConverter

把pattern格式的value轉換成標準格式的相應的XXX類。這些類可以分為兩大類:一類為時間,一類為數值。

1、時間類最后都會通過SimpleDateFormat類對值進行轉換,程序如下:

if(pattern == null) {

pattern = locPattern ? new SimpleDateFormat().toLocalizedPattern() :

new SimpleDateFormat().toPattern();

}

SimpleDateFormat format = new SimpleDateFormat(pattern, locale);

if (locPattern) {

formatter.applyLocalizedPattern(pattern);

}else {

formatter.applyPattern(pattern);

}

return formatter.parse((String) value);

2、數值類最后都會通過DecimalFormat類對值進行轉換,程序如下:

DecimalFormat formatter = (DecimalFormat) DecimalFormat.getInstance(locale);

if (pattern != null) {

if (locPattern) {

formatter.applyLocalizedPattern(pattern);

} else {

formatter.applyPattern(pattern);

}

}

return formatter.parse((String) value);

這個轉化過程要注意精度的問題。由于Number類是所有的數值類的父類,所以轉換完成后要檢查最后的結果是否是當前要求的精度:如果大于所要求的精度,則拋出ConversionException異常。

Commons-Beanutils(三)

Dyna開頭的類,是專門為DynaFormBean而設計的。

一、DynaBean,DynaClass 與 DynaProperty

DynaBean并不是Java中所定義的Bean,而是一種“假”的Bean。因為它并不是通過getXXX和setXXX方法,對XXX屬性進行取值和設值的。它通過一個實現了DynaClass接口的類,幫助管理其所有的屬性的類別,而自己則管理對XXX屬性值的設定和獲取。在設值的時候會通過與 name對應的DynaProperty對象,檢查賦值的類別是否正確。

DynaProperty類描述的是DynaBean中所包含的屬性的類型。DynaProperty類有三個屬性:屬性的名稱:name,屬性的名稱;type,屬性的類別;contentType,如果 DynaProperty描述的是個容器對象(List或者Map),那么這個contentType就代表這個容器內元素的類別。這個類值得關注的地方是writeObject和readObject方法的實現。它會首先判斷自己的type是否是一個primitive的類,如果是,則先寫入true標志,再寫入對應的primitive類的編號;否則寫入false標志,再寫入type。因為在調用readObject方法時,如果得出的是 primitive類型,則type的值為XXX.TYPE而不是XXX.class。

DynaClass 是一個接口,用來管理DynaBean中所有的DynaProperty屬性。

二、BasiceDyanBean 與 BasicDynaClass

BasiceDyanBean 實現自DynaBean接口。它包含一個實現了DynaClass接口的類的對象,和一個用來存放值的HashMap。這個HashMap的key與DynaClass中HashMap的key是一一對應的。

BasicDynaClass 實現了DynaClass接口,以DynaProperty的name為key保存所有這些DynaProperty對象。它通過newInstance 方法動態生成實現了DynaBean接口的類的對象;注意這個類是可以動態指定的,如果沒有,那么就是默認的BasicDynaBean類。動態指定類是通過反射實現的,程序如下:

//dynaBeanClass為任意的實現了DynaBean接口的類,constructorTypes為這個

//類的構造方法所需要的參數的類型

constructor = dynaBeanClass.getConstructor(constructorTypes);

//constructorValues為構造方法的參數值,實際上它的值為當前的BasicDynaClass

return ((DynaBean) constructor.newInstance(constructorValues));

Commons-Beanutils(四)

一、ConvertUtils 和 ConvertUtilsBean

ConvertUtils 是ConvertUtilsBean類的一個簡單封裝,即ConvertUtils中的所有方法都是通過直接調用ConvertUtilsBean中的同名方法實現的。如果你需要更復雜的功能,就使用ConvertUtilsBean,否則使用ConvertUtils。

ConvertUtilsBean 通過一個HashMap管理所有的XXXConverter。這個HashMap的key為XXX的類全名,值為相應的XXXConverter對象。通過deregister()方法,初始化這個HashMap。這個初始化方法會為每一個XXXConverter類提供一個缺省的值。用戶可以動過 setDefaultXXX(...)方法來自行設置XXXConverter對象的缺省值。這個類還提供了convert(...)方法,對 String value進行相應的轉化。

二、PropertyUtils 和 PropertyUtilsBean

PropertyUtils 是PropertyUtilsBean類的一個簡單封裝,同樣它的所有方法都是通過直接調用PropertyUtilsBean 中同名方法實現的。

PropertyUtilsBean 對DynaBean或者一個java標準Bean中的屬性動態的賦值和取值(非通過getXXX和setXXX方法)。

1、這個類支持多層嵌套,比如:XXX[i].YYY(key).ZZZ,那么它會為你得到或者設置ZZZ的屬性。

2、所有的set/get方法介紹:

//對XXX(key)格式的name設值

setMappedProperty(Object bean, String name,String key, Object value)

//對XXX[i]格式的name設值

setIndexed

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!