BeanUtils.copyProperties比较

来源:互联网 发布:一夫多妻体验知乎 编辑:程序博客网 时间:2024/05/29 13:52

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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 安置房房东违约怎么办 安置房产权到期怎么办 安置房怎么办房产证吗 美甲后指甲长了怎么办 在菲律宾怎么办持枪证? 绝地求生打不准怎么办 身份证号码变更后社保怎么办 社保与身份不符怎么办 年龄改了学籍怎么办 结婚证信息错误怎么办 六级身份证过期怎么办 身份号泄露了怎么办 身体证信息泄露怎么办 手机号被泄漏了怎么办 姓名和电话泄露怎么办 个人身份证信息泄露怎么办 身份号码泄露了怎么办 我身份证泄露了怎么办 身份证信息泄漏了怎么办 无锡身份证丢了怎么办 人在外地怎么办身份证 欠空放公司不还怎么办 兼职要身份证照片怎么办 身份证刷不了磁怎么办 身份证不能刷了怎么办 身份证指纹错了怎么办 指纹手机丢了怎么办 异地办理临时身份证怎么办 杭州办理外地身份证怎么办 办理身份证没有户口本怎么办 2018身份证掉了怎么办 双户口注销社保怎么办 常用户口被注销怎么办 刚到厦门怎么办身份证 新疆身份证丢了怎么办 技能证书丢了怎么办 16岁拍身份证怎么办 16岁以下怎么办身份证 办身份证要证明怎么办 15岁怎么办银行卡淘宝 满16岁怎么办银行卡