BeanUtils.copyProperties()方法 && 关于BeanUtil.copyProperties性能

BeanUtils.copyProperties()方法

这两天在反复的处理着一个问题,

类A的一个对象a

类B的一个对象b

对象a和对象b有一些共同的属性(属性的类型名称相同均相同)

然后想把a对象的属性值赋给b对象(a和b共同的属性)
于是分别写

a.setXX(b.getXX());

a.setXX(b.getXX());

a.setXX(b.getXX());

a.setXX(b.getXX());

a.setXX(b.getXX());

a.setXX(b.getXX());

发现属性多的时候这样写会很麻烦,于是便想有没有一个方法可以实现这个操作。

通过查询资料发现一个BeanUtils.copyProperties()方法能处理这个问题

上面的N行代码被替换成一行代码:

BeanUtils.copyProperties ( a , b );

哈哈,是不是很爽啊。

 

PS:1)以下2和3没有经过实践,只是理论。

2)对于那些自定义的对象类型属性,此方法不好使,仍需手动赋值。。。。

3)还有java.util.Date类型的属性此方法也不好使,但java.sql.Date,此方法就好使了。

        4)BeanUtils类在

org.apache.commons.beanutils.BeanUtils

org.springframework.beans.BeanUtils

包里都有,我用的是后面那个。

转自:http://www.cnblogs.com/judy/archive/2010/05/27/1745423.html

关于BeanUtil.copyProperties性能

eanUtil.copyProperties 方法确实很方便,代码写出来非常优美,不会有很多的get set,但由于用到反射,可能存在潜在的性能问题。因此对spring 和 commons的BeanUtil.copyProperties进行了对照测试,代码大致如下: 

Java代码  收藏代码
  1. @Test  
  2.     public void copyPropertiesTest() throws IllegalAccessException, InvocationTargetException {  
  3.           
  4.         po = new PromotionPO();  
  5.         Timestamp now = new Timestamp(System.currentTimeMillis());  
  6.         model = RetailmodelFactory.eINSTANCE.createPromotion();  
  7. //get/set  
  8.         Long startTime = System.currentTimeMillis();  
  9.         for (int i = 0; i < LOOP_NUMBER; i++) {  
  10.             model.setCode("code");  
  11.             model.setDescription("haha");  
  12.             model.setDiscount(5.4);  
  13.             model.setEndTime(now);  
  14.             model.setID(39578395L);  
  15.             model.setPriority(1);  
  16.             model.setPromotionType(3);  
  17.             model.setStartTime(now);  
  18.             model.setSupplierID("123245L");  
  19.         }  
  20.         Long endTime = System.currentTimeMillis();  
  21.         traditionalCopyTIme = endTime - startTime;  
  22.           
  23. //spring  
  24.         startTime = System.currentTimeMillis();  
  25.         for (int i = 0; i < LOOP_NUMBER; i++) {  
  26.             BeanUtils.copyProperties(model, po);  
  27.         }  
  28.         endTime = System.currentTimeMillis();  
  29.         springCopyPropertiesTime = endTime - startTime;  
  30.   
  31. //commons         
  32.         startTime = System.currentTimeMillis();  
  33.         for (int i = 0; i < LOOP_NUMBER; i++) {  
  34.             org.apache.commons.beanutils.BeanUtils.copyProperties(po,model);  
  35.         }  
  36.         endTime = System.currentTimeMillis();  
  37.         commonsCopyPropertiesTime = endTime - startTime;  
  38.           
  39.         logger.info("normal copy Time: " +  traditionalCopyTIme + "ms.");  
  40.         logger.info("Spring BeanUtil copy Time: " +  springCopyPropertiesTime + "ms.");  
  41.         logger.info("Commons BeanUtil copy Time: " +  commonsCopyPropertiesTime + "ms.");  
  42.     }  


当 LOOP_NUMBER = 50000时(即执行50000次copy),结果如下: 

编号 set/get Spring BeanUtil Commons BeanUtil
1 62ms 1703ms 63860ms
1 16ms 1359ms 62328ms
1 16ms 1359ms 63047ms
1 0ms 1390ms 63047ms
1 16ms 1375ms 62266ms



可看出Commons BeanUtil的copyProperties 性能最差,几乎不能忍受。spring的copyProperties有可能在接受范围内。直接set/get虽然丑陋,但是性能确实非常好,几乎可以忽略。 
接下来对spring和commons两种不同实现进行分析。

posted on 2012-07-20 16:38  Nolan  阅读(2903)  评论(0编辑  收藏  举报