日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Commons BeanUtils包学习2

發(fā)布時間:2025/3/19 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Commons BeanUtils包学习2 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標準>>>

Commons BeanUtils包學習2 博客分類: 中間件 java

一、簡介:
BeanUtils提供對 Java反射和自省API的包裝。其主要目的是利用反射機制對JavaBean的屬性進行處理。我們知道,一個JavaBean通常包含了大量的屬性,很多情況下,對JavaBean的處理導致大量get/set代碼堆積,增加了代碼長度和閱讀代碼的難度。

二、用法:
BeanUtils是這個包里比較常用的一個工具類,這里只介紹它的copyProperties()方法。該方法定義如下:
public static void copyProperties(java.lang.Object dest,java.lang.Object orig) throws java.lang.IllegalAccessException, java.lang.reflect.InvocationTargetException

如果你有兩個具有很多相同屬性的JavaBean,一個很常見的情況就是Struts里的PO對象(持久對象)和對應(yīng)的ActionForm,例如 Teacher和TeacherForm。我們一般會在Action里從ActionForm構(gòu)造一個PO對象,傳統(tǒng)的方式是使用類似下面的語句對屬性逐個賦值:

//得到
TeacherFormTeacherForm
teacherForm=(TeacherForm)form;//構(gòu)造Teacher對象
Teacher teacher=new Teacher();//賦值
teacher.setName(teacherForm.getName());
teacher.setAge(teacherForm.getAge());
teacher.setGender(teacherForm.getGender());
teacher.setMajor(teacherForm.getMajor());
teacher.setDepartment(teacherForm.getDepartment());//持久化Teacher對象到數(shù)據(jù)庫
HibernateDAO=;
HibernateDAO.save(teacher);

而使用BeanUtils后,代碼就大大改觀了,如下所示:
//得到
TeacherFormTeacherForm
teacherForm=(TeacherForm)form;//構(gòu)造Teacher對象
Teacher teacher=new Teacher();//賦值
BeanUtils.copyProperties(teacher,teacherForm);//持久化Teacher對象到數(shù)據(jù)庫
HibernateDAO=;
HibernateDAO.save(teacher);

如果Teacher和TeacherForm間存在名稱不相同的屬性,則BeanUtils不對這些屬性進行處理,需要程序員手動處理。例如 Teacher包含modifyDate(該屬性記錄最后修改日期,不需要用戶在界面中輸入)屬性而TeacherForm無此屬性,那么在上面代碼的 copyProperties()后還要加上一句:

teacher.setModifyDate(new Date());

怎么樣,很方便吧!除BeanUtils外還有一個名為PropertyUtils的工具類,它也提供copyProperties()方法,作用與BeanUtils的同名方法十分相似,主要的區(qū)別在于后者提供類型轉(zhuǎn)換功能,即發(fā)現(xiàn)兩個JavaBean的同名屬性為不同類型時,在支持的數(shù)據(jù)類型范圍內(nèi)進行轉(zhuǎn)換,而前者不支持這個功能,但是速度會更快一些。BeanUtils支持的轉(zhuǎn)換類型如下:

* java.lang.BigDecimal * java.lang.BigInteger * boolean and java.lang.Boolean * byte and java.lang.Byte * char and java.lang.Character * java.lang.Class * double and java.lang.Double * float and java.lang.Float * int and java.lang.Integer * long and java.lang.Long * short and java.lang.Short * java.lang.String * java.sql.Date * java.sql.Time * java.sql.Timestamp
這里要注意一點,java.util.Date是不被支持的,而它的子類java.sql.Date是被支持的。因此如果對象包含時間類型的屬性,且希望被轉(zhuǎn)換的時候,一定要使用java.sql.Date類型。否則在轉(zhuǎn)換時會提示argument mistype異常。

三、優(yōu)缺點:
Apache Jakarta Commons項目非常有用。我曾在許多不同的項目上或直接或間接地使用各種流行的commons組件。其中的一個強大的組件就是BeanUtils。我將說明如何使用BeanUtils將local實體bean轉(zhuǎn)換為對應(yīng)的value 對象:
BeanUtils.copyProperties(aValue, aLocal)
上面的代碼從aLocal對象復(fù)制屬性到aValue對象。它相當簡單!它不管local(或?qū)?yīng)的value)對象有多少個屬性,只管進行復(fù)制。我們假設(shè)local對象有100個屬性。上面的代碼使我們可以無需鍵入至少100行的冗長、容易出錯和反復(fù)的get和set方法調(diào)用。這太棒了!太強大了!太有用了!

現(xiàn)在,還有一個壞消息:使用BeanUtils的成本驚人地昂貴!我做了一個簡單的測試,BeanUtils所花費的時間要超過取數(shù)據(jù)、將其復(fù)制到對應(yīng)的 value對象(通過手動調(diào)用get和set方法),以及通過串行化將其返回到遠程的客戶機的時間總和。所以要小心使用這種威力!

Common BeanUtils簡單使用
屬性的動態(tài)getter、setter
有時候?qū)傩允且鶕?jù)名字動態(tài)取得的:  
BeanUtils.getProperty(myBean,"code");
而Common BeanUtils的更強功能在于可以直接訪問內(nèi)嵌對象的屬性,只要使用點號分隔。
BeanUtils.getProperty(orderBean, "address.city");
相比之下其他類庫的BeanUtils通常都很簡單,不能訪問內(nèi)嵌的對象,所以有時要用Commons BeanUtils來替換它們。BeanUtils還支持List和Map類型的屬性,如下面的語法即可取得Order的顧客列表中第一個顧客的名字。
BeanUtils.getProperty(orderBean, "customers[1].name");
其中BeanUtils會使用ConvertUtils類把字符串轉(zhuǎn)為Bean屬性的真正類型,方便從HttpServletRequest等對象中提取bean,或者把bean輸出到頁面。
而PropertyUtils就會原色的保留Bean原來的類型。
2.BeanCompartor 動態(tài)排序
還是通過反射,動態(tài)設(shè)定Bean按照哪個屬性來排序,而不再需要在實現(xiàn)bean的Compare接口進行復(fù)雜的條件判斷。
List peoples = ...; // Person對象的列表
Collections.sort(peoples, new BeanComparator("age"));
如果要支持多個屬性的復(fù)合排序,如"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 commons-collections包。
如果age屬性不是普通類型,構(gòu)造函數(shù)需要再傳入一個comparator對象為age變量排序。
另外, BeanCompartor本身的ComparebleComparator, 遇到屬性為null就會拋出異常, 也不能設(shè)定升序還是降序。這個時候又要借助commons-collections包的ComparatorUtils.
Comparator mycmp = ComparableComparator.getInstance();
mycmp = ComparatorUtils.nullLowComparator(mycmp); //允許null
mycmp = ComparatorUtils.reversedComparator(mycmp); //逆序
Comparator cmp = new BeanComparator(sortColumn, mycmp);
3.Converter 把Request或ResultSet中的字符串綁定到對象的屬性
經(jīng)常要從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方法其實都會調(diào)用convert進行轉(zhuǎn)換。
但Converter只支持一些基本的類型,甚至連java.util.Date類型也不支持。而且它比較笨的一個地方是當遇到不認識的類型時,居然會拋出異常來。對于Date類型,我參考它的sqldate類型實現(xiàn)了一個Converter,而且添加了一個設(shè)置日期格式的函數(shù)。
要把這個Converter注冊,需要如下語句:
ConvertUtilsBean convertUtils = new ConvertUtilsBean();
DateConverter dateConverter = new DateConverter();
convertUtils.register(dateConverter,Date.class);

//因為要注冊converter,所以不能再使用BeanUtils的靜態(tài)方法了,必須創(chuàng)建BeanUtilsBean實例
BeanUtilsBean beanUtils = new BeanUtilsBean(convertUtils,new PropertyUtilsBean());
beanUtils.setProperty(bean, name, value);

?

public static void copyProperties(Object source, Object target)
throws BeansException
{
BeanCopier beanCopier = BeanCopier.create(source.getClass(), target.getClass(), false);
beanCopier.copy(source, target, null);
}

public static Object getPropertyValue(Object bean, String property)throws BeansException{
Object value = null;
try{
PropertyDescriptor des = getPropertyDescriptor(bean.getClass(), property);
Method readMethod = des.getReadMethod();
if(!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers()))
readMethod.setAccessible(true);
value = readMethod.invoke(bean, new Object[0]);
}catch(Exception ex){
throw new FatalBeanException("Could not get property["+property+"] value", ex);
}
return value;
}

轉(zhuǎn)載于:https://my.oschina.net/xiaominmin/blog/1598202

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的Commons BeanUtils包学习2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。