Beanutils用了魔術般的反射技術實現了很多誇張有用的功能都是C/C++時代不敢想的無論誰的項目始終一天都會用得上它我算是後知後覺了第一回看到它的時候居然錯過
屬性的動態gettersetter
在這框架滿天飛的年代
不能事事都保證執行getter
setter函數了
有時候屬性是要根據名字動態取得的
就像這樣
BeanUtilsgetProperty(myBeancode);
而Common BeanUtils的更強功能在於可以直接訪問內嵌對象的屬性
只要使用點號分隔
BeanUtilsgetProperty(orderBean addresscity);
相比之下其他類庫的BeanUtils通常都很簡單
不能訪問內嵌的對象
所以有時要用Commons BeanUtils來替換它們
BeanUtils還支持List和Map類型的屬性
如下面的語法即可取得Order的顧客列表中第一個顧客的名字
BeanUtilsgetProperty(orderBean customers[]name);
其中BeanUtils會使用ConvertUtils類把字符串轉為Bean屬性的真正類型
方便從HttpServletRequest等對象中提取bean
或者把bean輸出到頁面
而PropertyUtils就會原色的保留Bean原來的類型
BeanCompartor 動態排序
還是通過反射
動態設定Bean按照哪個屬性來排序
而不再需要在實現bean的Compare接口進行復雜的條件判斷
List peoples = ; // Person對象的列表
Collectionssort(peoples new BeanComparator(age));
如果要支持多個屬性的復合排序如Order By lastNamefirstName
ArrayList sortFields = new ArrayList();
sortFieldsadd(new BeanComparator(lastName));
sortFieldsadd(new BeanComparator(firstName));
ComparatorChain multiSort = new ComparatorChain(sortFields);
Collectionssort(rowsmultiSort);
其中ComparatorChain屬於jakata commonscollections包
如果age屬性不是普通類型構造函數需要再傳入一個comparator對象為age變量排序
另外 BeanCompartor本身的ComparebleComparator 遇到屬性為null就會拋出異常 也不能設定升序還是降序這個時候又要借助commonscollections包的ComparatorUtils
Comparator mycmp = ComparableComparatorgetInstance();
mycmp = ComparatorUtilsnullLowComparator(mycmp); //允許null
mycmp = ComparatorUtilsreversedComparator(mycmp); //逆序
Comparator cmp = new BeanComparator(sortColumn mycmp);
Converter 把Request或ResultSet中的字符串綁定到對象的屬性
經常要從requestresultSet等對象取出值來賦入bean中如果不用MVC框架的綁定功能的話下面的代碼誰都寫膩了
String a = requestgetParameter(a); beansetA(a); String b =
beansetB(b);
不妨寫一個Binder自動綁定所有屬性:
MyBean bean = ;
HashMap map = new HashMap();
Enumeration names = requestgetParameterNames();
while (nameshasMoreElements())
{
String name = (String) namesnextElement();
mapput(name requestgetParameterValues(name));
}
BeanUtilspopulate(bean map);
其中BeanUtils的populate方法或者getPropertysetProperty方法其實都會調用convert進行轉換
但Converter只支持一些基本的類型甚至連javautilDate類型也不支持而且它比較笨的一個地方是當遇到不認識的類型時居然會拋出異常來 對於Date類型我參考它的sqldate類型實現了一個Converter而且添加了一個設置日期格式的函數
要把這個Converter注冊需要如下語句
ConvertUtilsBean convertUtils = new ConvertUtilsBean();
DateConverter dateConverter = new DateConverter();
convertUtilsregister(dateConverterDateclass);
//因為要注冊converter所以不能再使用BeanUtils的靜態方法了必須創建BeanUtilsBean實例
BeanUtilsBean beanUtils = new BeanUtilsBean(convertUtilsnew PropertyUtilsBean());
beanUtilssetProperty(bean name value);
其他功能
ConstructorUtils動態創建對象
public static Object invokeConstructor(Class klass Object arg)
MethodUtils動態調用方法 MethodUtilsinvokeMethod(bean methodName parameter);
PropertyUtils當屬性為CollectionMap時的動態讀取
Collection: 提供index
BeanUtilsgetIndexedProperty(orderBeanitems);
或者
BeanUtilsgetIndexedProperty(orderBeanitems[]);
Map: 提供Key Value
BeanUtilsgetMappedProperty(orderBean items);//keyvalue goods_no=
或者
BeanUtilsgetMappedProperty(orderBean items())
PropertyUtils直接獲取屬性的Class類型 public static Class getPropertyType(Object bean String name)
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25458.html