熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Javascript >> 正文

始終會用上的Common BeanUtils

2013-11-23 17:58:28  來源: Javascript 

  Beanutils用了魔術般的反射技術實現了很多誇張有用的功能都是C/C++時代不敢想的無論誰的項目始終一天都會用得上它我算是後知後覺了第一回看到它的時候居然錯過

  屬性的動態gettersetter


    在這框架滿天飛的年代不能事事都保證執行gettersetter函數了有時候屬性是要根據名字動態取得的就像這樣  

  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
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.