BeanUtils.copyProperties比较

1.概述

在项目中遇到要将数据库对象转换为领域对象,不想一个个写set(get()),也不想自己去写反射,于是比较了一下开源的几个工具类。个人了解的有apache的BeanUtils,PropertiesUitls,还有spring的BeanUtils。纠结于哪个更合适,于是比较了一下。

 

2.比较

 

 apache PropertiesUtilsapache BeanUtilsspring BeanUtils 
实现复杂度复杂 复杂简单 
功能特点

将源对象中和目标对象同名的属性(浅拷贝),同名不同类

型抛异常(checked exception)

同前,提供同名不同类型的

类型转换并支持扩展

同PropertiesUtils 
性能

3个属性的对象,拷贝100w次

个人电脑2000ms

5000ms600ms

 

综上所述,个人这个case是spring的BeanUtils更合适。apache的虽然更强大(考虑的细节和分支条件更多),

但暂时用不到,而且性能差距还是比较明显。

 

对于转换类为map的describe方法,spring的Utils没有,但很容易利用他现有方法扩展:

 

Java代码   收藏代码
  1. public static Map<String, Object> describe(Object source) {  
  2.         Assert.notNull(source, "Source must not be null");  
  3.         HashMap<String, Object> result = new HashMap<String, Object>();  
  4.         Class<?> clazz = source.getClass();  
  5.         PropertyDescriptor[] sourcePds = BeanUtils.getPropertyDescriptors(clazz);  
  6.         for (int i = 0; i < sourcePds.length; i++) {  
  7.             PropertyDescriptor sourcePd = sourcePds[i];  
  8.             String name = sourcePd.getName();  
  9.             if (ignoreList.contains(name)) {  
  10.                 continue;  
  11.             }  
  12.   
  13.             try {  
  14.                 Method readMethod = sourcePd.getReadMethod();  
  15.                 if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {  
  16.                     readMethod.setAccessible(true);  
  17.                 }  
  18.                 Object value = readMethod.invoke(source, new Object[0]);  
  19.                 result.put(name, value);  
  20.             } catch (Throwable e) {  
  21.                 throw new FatalBeanException("Could not copy properties from source to HashMap", e);  
  22.             }  
  23.   
  24.         }  
  25.         return result;  
  26.     }  
  27.       
 

 

3.总结

 

首先是否用反射来拷贝,本来就是在开发速度和运行速度之间的一个权衡。考虑到性能损耗在不大(对于本应用的性能需求来说),所以选择用反射工具。

 

对于性能,spring比较快主要是因为逻辑简单些,而且缓存了BeanInfo信息,同样的类不用每次都取。也算是空间换时间,当然更激进一点,可以像fastjson一样,用字节码方式把每个类型对生成一个拷贝类,时间上就和直接get,set差不多了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值