BeanUtils & PropertyUtils & MethodUtils類使用方法

來源:互聯網
上載者:User

一、簡介:

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

二、用法:

BeanUtils是這個包裡比較常用的一個工具類,這裡只介紹它的copyProperties()方法。該方法定義如下:

Java代碼
  1. public static void copyProperties(java.lang.Object dest,java.lang.Object orig)   
  2. throws java.lang.IllegalAccessException,   
  3.        java.lang.reflect.InvocationTargetException  
  public static void copyProperties(java.lang.Object dest,java.lang.Object orig)  throws java.lang.IllegalAccessException,         java.lang.reflect.InvocationTargetException

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

Java代碼
  1. //得到TeacherForm   
  2. TeacherForm teacherForm=(TeacherForm)form;   
  3. //構造Teacher對象   
  4. Teacher teacher=new Teacher();   
  5. //賦值   
  6. teacher.setName(teacherForm.getName());   
  7. teacher.setAge(teacherForm.getAge());   
  8. teacher.setGender(teacherForm.getGender());   
  9. teacher.setMajor(teacherForm.getMajor());   
  10. teacher.setDepartment(teacherForm.getDepartment());   
  11.   
  12. //持久化Teacher對象到資料庫   
  13. HibernateDAO=;   
  14. HibernateDAO.save(teacher);   
  15.   
  16.   
  17. 而使用BeanUtils後,代碼就大大改觀了,如下所示:   
  18. //得到TeacherForm   
  19. TeacherForm teacherForm=(TeacherForm)form;   
  20. //構造Teacher對象   
  21. Teacher teacher=new Teacher();   
  22. //賦值   
  23. BeanUtils.copyProperties(teacher,teacherForm);   
  24. //持久化Teacher對象到資料庫   
  25. HibernateDAO=;   
  26. HibernateDAO.save(teacher);  
//得到TeacherFormTeacherForm teacherForm=(TeacherForm)form;//構造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對象到資料庫HibernateDAO=;HibernateDAO.save(teacher);而使用BeanUtils後,代碼就大大改觀了,如下所示://得到TeacherFormTeacherForm teacherForm=(TeacherForm)form;//構造Teacher對象Teacher teacher=new Teacher();//賦值BeanUtils.copyProperties(teacher,teacherForm);//持久化Teacher對象到資料庫HibernateDAO=;HibernateDAO.save(teacher);

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

Java代碼
  1. teacher.setModifyDate(new Date());  
teacher.setModifyDate(new Date());

怎麼樣,很方便吧!除BeanUtils外還有一個名為PropertyUtils的工具類,它也提供copyProperties()方法,作用與 BeanUtils的同名方法十分相似,主要的區別在於後者提供類型轉換功能,即發現兩個JavaBean的同名屬性為不同類型時,在支援的資料類型範圍內進行轉換,而前者不支援這個功能,但是速度會更快一些。BeanUtils支援的轉換類型如下:

    * 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是被支援的。因此如果對象包含時間類型的屬性,且希望被轉換的時候,一定要使用java.sql.Date類型。否則在轉換時會提示argument mistype異常。

三、優缺點:

Apache Jakarta Commons項目非常有用。我曾在許多不同的項目上或直接或間接地使用各種流行的commons組件。其中的一個強大的組件就是BeanUtils。我將說明如何使用BeanUtils將local實體bean轉換為對應的value 對象:

Java代碼
  1. BeanUtils.copyProperties(aValue, aLocal);  
BeanUtils.copyProperties(aValue, aLocal);

上面的代碼從aLocal對象複製屬性到aValue對象。它相當簡單!它不管local(或對應的value)對象有多少個屬性,只管進行複製。我們假設local對象有100個屬性。上面的代碼使我們可以無需鍵入至少100行的冗長、容易出錯和反覆的get和set方法調用。這太棒了!太強大了!太有用了!

BeanUtils.copyProperties 與 PropertyUtils.copyProperties 都是拷貝對象屬性的方法,BeanUtils 支援類型轉換,而 PropertyUtils 不支援。但是 BeanUtils 不允許對象的屬性值為 null,PropertyUtils 可以拷貝屬性值 null 的對象。
如果對象屬性值為 null,BeanUtils.copyProperties 方法會報 commons.beanutils.ConversionException: No value specified 錯誤。

現在,還有一個壞訊息:使用BeanUtils的成本驚人地昂貴!我做了一個簡單的測試,BeanUtils所花費的時間要超過取資料、將其複製到對應的 value對象(通過手動調用get和set方法),以及通過序列化將其返回到遠端客戶機的時間總和。所以要小心使用這種威力!

MethodUtils類使用方法:

Java代碼
  1. package rong.propertyUtils;   
  2.   
  3. import java.util.Map;   
  4. import org.apache.commons.beanutils.MethodUtils;   
  5. import org.apache.commons.beanutils.PropertyUtils;   
  6.   
  7. public class TestPropertyUtils {   
  8.        
  9.     public static void main(String[] args) throws Exception{   
  10.            
  11.         Entity entity = new Entity();   
  12.            
  13.         //通過PropertyUtils的getProperty方法擷取指定屬性的值   
  14.         Integer id = (Integer)PropertyUtils.getProperty(entity, "id");   
  15.         String name = (String)PropertyUtils.getProperty(entity, "name");   
  16.         System.out.println("id = " + id + "  name = " + name);   
  17.            
  18.         //調用PropertyUtils的setProperty方法設定entity的指定屬性   
  19.         PropertyUtils.setProperty(entity, "name", "心夢帆影");   
  20.         System.out.println("name = " + entity.getName());   
  21.            
  22.         //通過PropertyUtils的describe方法把entity的所有屬性與屬性值封裝進Map中   
  23.         Map map = PropertyUtils.describe(entity);   
  24.         System.out.println("id = " + map.get("id") + "  name = " + map.get("name"));   
  25.            
  26.         //通過MethodUtils的invokeMethod方法,執行指定的entity中的方法(無參的情況)   
  27.         System.out.println( MethodUtils.invokeMethod(entity, "haha", null) );   
  28.            
  29.         //通過MethodUtils的invokeMethod方法,執行指定的entity中的方法(1參的情況)   
  30.         MethodUtils.invokeMethod(entity, "sayHelle", "心夢帆影");   
  31.            
  32.         //通過MethodUtils的invokeMethod方法,執行指定的entity中的方法(多參的情況)   
  33.         Object[] params = new Object[]{new Integer(10),new Integer(12)};   
  34.         String msg = (String)MethodUtils.invokeMethod(entity, "countAges", params);   
  35.         System.out.println(msg);   
  36.            
  37.     }   
  38.   
  39. }  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.