Beanutils用了魔術般的反射技術 實現了很多誇張有用的功能 都是C/C++時代不敢想的 無論誰的項目 始終壹天都會用得上它 我算是後知後覺了 第壹回看到它的時候居然錯過
屬性的動態getter setter
在這框架滿天飛的年代 不能事事都保證執行getter setter函數了 有時候屬性是要根據名字動態取得的 就像這樣BeanUtils getProperty(myBean code );
而Common BeanUtils的更強功能在於可以直接訪問內嵌對象的屬性 只要使用點號分隔BeanUtils getProperty(orderBean address city );
相比之下其他類庫的BeanUtils通常都很簡單 不能訪問內嵌的對象 所以有時要用Commons BeanUtils來替換它們 BeanUtils還支持List和Map類型的屬性 如下面的語法即可取得Order的顧客列表中第壹個顧客的名字BeanUtils getProperty(orderBean customers[ ] name );
其中BeanUtils會使用ConvertUtils類把字符串轉為Bean屬性的真正類型 方便從HttpServletRequest等對象中提取bean 或者把bean輸出到頁面 而PropertyUtils就會原色的保留Bean原來的類型
BeanCompartor 動態排序
還是通過反射 動態設定Bean按照哪個屬性來排序 而不再需要在實現bean的Compare接口進行復雜的條件判斷List peoples = ; // Person對象的列表Collections sort(peoples new BeanComparator( age ));
如果要支持多個屬性的復合排序 如 Order By lastName firstName
ArrayList sortFields = new ArrayList();sortFields add(new BeanComparator( lastName ));sortFields add(new BeanComparator( firstName ));ComparatorChain multiSort = new ComparatorChain(sortFields);Collections sort(rows multiSort);
其中ComparatorChain屬於jakata mons collections包 如果age屬性不是普通類型 構造函數需要再傳入壹個parator對象為age變量排序 另外 BeanCompartor本身的ComparebleComparator 遇到屬性為null就會拋出異常 也不能設定升序還是降序 這個時候又要借助mons collections包的ComparatorUtils
Comparator mycmp = ComparableComparator getInstance();mycmp = ComparatorUtils nullLowComparator(mycmp);? //允許null? mycmp = ComparatorUtils reversedComparator(mycmp); //逆序? Comparator cmp = new BeanComparator(sortColumn mycmp);
Converter 把Request或ResultSet中的字符串綁定到對象的屬性經常要從request resultSet等對象取出值來賦入bean中 如果不用MVC框架的綁定功能的話 下面的代碼誰都寫膩了
String a = request getParameter( a ); bean setA(a); String b = bean setB(b);
不妨寫壹個Binder自動綁定所有屬性:
MyBean bean = ; HashMap map = new HashMap(); Enumeration names = request getParameterNames(); while (names hasMoreElements()) { String name = (String) names nextElement(); map put(name request getParameterValues(name)); } BeanUtils populate(bean map);
其中BeanUtils的populate方法或者getProperty setProperty方法其實都會調用convert進行轉換 但Converter只支持壹些基本的類型 甚至連java util Date類型也不支持 而且它比較笨的壹個地方是當遇到不認識的類型時 居然會拋出異常來 ?對於Date類型 我參考它的sqldate類型實現了壹個Converter 而且添加了壹個設置日期格式的函數 要把這個Converter註冊 需要如下語句
ConvertUtilsBean convertUtils = new ConvertUtilsBean();? DateConverter dateConverter = new DateConverter();? convertUtils register(dateConverter Date class); //因為要註冊converter 所以不能再使用BeanUtils的靜態方法了 必須創建BeanUtilsBean實例BeanUtilsBean beanUtils = new BeanUtilsBean(convertUtils new PropertyUtilsBean()); beanUtils setProperty(bean name value);
其他功能 ConstructorUtils 動態創建對象public static Object invokeConstructor(Class klass Object arg)
MethodUtils 動態調用方法MethodUtils invokeMethod(bean methodName parameter);
PropertyUtils 當屬性為Collection Map時的動態讀取 Collection: 提供indexBeanUtils getIndexedProperty(orderBean items );
或者BeanUtils getIndexedProperty(orderBean items[ ] );
Map: 提供Key ValueBeanUtils getMappedProperty(orderBean items );//key value goods_no=
或者BeanUtils getMappedProperty(orderBean items( ) )
PropertyUtils 直接獲取屬性的Class類型 lishixinzhi/Article/program/Java/Javascript/201311/25458