CommonsBeanutils(一) Commons
Beanutils 這個是jakarta commons項目中的一個子項目
這個項目開發的目的是幫助開發者動態的獲取/設值Java Bean的屬性
同時解決每次都要寫getXXX和setXXX的麻煩
一XXXConvert 這些類都實現Converter接口
提供把value值轉化成為相應XXX類的實現
現在只針對四種類型
數字
時間
Boolean和String
在Converter 接口中只有一個方法convert(Class type
Object value)
把value對象轉換為type所要求的類
XXXConvert類中這個方法的思路是
如果value==null
並且自己內部有缺省的值那麼就返回這個缺省的值
如果沒有缺省值
就拋出ConversionException異常
如果value instanceOf XXX類
那麼就直接返回value
如果上面的都不行
那麼調用new XXX(value
toString())或者XXX
valueOf(value
toString())方法來返回
轉化失敗時
拋出ConversionException異常
二特殊的實現 對於ClassConverter類
當進入第三種情形的時候
實際執行的是
ClassLoader classLoader =Thread
currentThread()
getContextClassLoader(); if (classLoader == null) { classLoader = ClassConverter
class
getClassLoader(); } return (classLoader
loadClass(value
toString()));
對於BooleanConverter類
當進入第三種情形的時候
實際執行的是
根據value
toString()的值
yes
y
true
on
返回true
no
n
false
off
返回false
如果這些情形都不符合
並且有缺省值的時候則返回缺省值
否則拋出ConversionException
三XXXArrayConverter 這些類繼承自AbstractArrayConverter類
AbstractArrayConverter 實際只實現了一個List parseElements(String svalue)方法
這個方法接受的是{value
value
}格式的字符串
逐個解析出來後
放入一個ArrayList中
它通過StreamTokenizer解析字符串
StreamTokenizer是用來分離input stream中讀取的字符串
並且可以根據標記區分不同的內容
比如數字
字符或者注釋
XXXArrayConverter由於要轉換的是一個數組
所以convert(
)方法的實現過程有所不同
如果value==null
並且自己內部有缺省的值那麼就返回這個缺省的值
如果沒有缺省值
就拋出ConversionException異常
如果model
getClass() == value
getClass()
那麼就直接返回value
如果上面的都不行
那麼就通過parseElements(value
toString())生成一個數組
再對數組的元素逐個調用new XXX(list
get(i))或者XXX
valueOf(list
get(i))方法
轉換成為數組對元素要求的類型
轉化失敗時
拋出ConversionException異常
CommonsBeanutils(二) 一LocaleConverter 與 BaseLocaleConverter LocaleConverter繼承自 Converter接口
定義了一個新方法convert(Class type
Object value
String pattern)
抽象類BaseLocaleConverter實現了LocaleConverter接口
它的locPattern屬性用來表示這個對象的pattern是否是本地化的格式
patttern 是指把何種格式的時間或者數字值轉換成標准值
convert(
)的執行過程是
如果value==null
並且自己內部有缺省的值那麼就返回這個缺省的值
如果沒有缺省值
就拋出ConversionException異常
根據參數pattern值是否為null
調用parse(Object value
String pattern)方法
如果這個參數不為null那麼就使用這個參數的值
否則使用對象預存的pattern值
如果這
樣做引起了異常
會首先判斷是否能夠返回缺省的值
不能則拋出ConversionException異常
parse(Object value
String
pattern)方法的實現被拋至繼承了它的類具體實現
這個方法雖然把value值表述為Object類型
但是最後都是通過強制轉換
轉換成為String類型
也就是說它實際上需要的
是String類型的value
二 XXXLocaleConverter 把pattern格式的value轉換成標准格式的相應的XXX類
這些類可以分為兩大類
一類為時間
一類為數值
時間類最後都會通過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);
數值類最後都會通過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異常
CommonsBeanutils(三) Dyna開頭的類
是專門為DynaFormBean而設計的
一DynaBeanDynaClass 與 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));
CommonsBeanutils(四) 一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方法)
這個類支持多層嵌套
比如
XXX[i]
YYY(key)
ZZZ
那麼它會為你得到或者設置ZZZ的屬性
所有的set/get方法介紹
//對XXX(key)格式的name設值
setMappedProperty(Object bean
String name
String key
Object value)
//對XXX[i]格式的name設值
setIndexed
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28632.html