java bean属性拷贝工具类比对(性能+功能)
业务系统中经常需要两个对象进行属性的拷贝,不能否认逐个的对象拷贝是最快速最安全的做法,但是当数据对象的属性字段数量超过程序员的容忍的程度比如通常超过5个属性的时候,代码因此变得臃肿不堪,使用一些方便的对象拷贝工具类将是很好的选择。
目前流行的较为公用认可的工具类:
Apache的两个版本:(反射机制)
org.apache.commons.beanutils.PropertyUtils.copyProperties(Object dest, Object orig)
org.apache.commons.beanutils.BeanUtils.copyProperties(Object dest, Object orig)
Spring版本:(反射机制)
org.springframework.beans.BeanUtils.copyProperties(Object source, Object target, Class editable, String[] ignoreProperties)
新版本的spring也集成了cglib版:org.springframework.cglib.beans.BeanCopier
cglib版本:(使用动态代理,效率高)
net.sf.cglib.beans.BeanCopier.copy(Object paramObject1, Object paramObject2, Converter paramConverter)
dozer版本(xml配置映射,性能最低下):
就API而言,使用哪个工具类无所谓,我们通常关心两点,功能完善性以及性能。

性能测试:
// 源POJO
package tf56.lf.lfbase.model.dto; import java.io.Serializable; import tf56.lf.lfbase.model.domain.LfProduct; /**
* ClassName:ProductDTO
*
* @version 1.0
* @since v1.0
* @Date 2017年6月19日 yuebiao.wu
*/ public class ProductDTO extends LfProduct implements Serializable{ private static final long serialVersionUID = -1296801547926874402L; } // 目标POJO
package tf56.lf.lfbase.model.domain; import java.io.Serializable;
import java.util.Date; import lombok.Getter;
import lombok.Setter; /**
* ClassName:Product
*
* @author tool
* @version 1.0
* @since v1.0
* Date Jun 26, 2017 2:40:42 PM
*/
@Getter
@Setter
public class LfProduct implements Serializable { private static final long serialVersionUID = 4054863309367744108L; /* 产品id */
private String lfProductId;
/* 物流金融账号 */
private String lfAccountId;
/* 产品名称 */
private String productName;
/* 产品类型(BAOFU:保付; MIAOFU:秒付; JISHIFU:即时付;) */
private String productType;
/* 适用场景列表(逗号分隔)(COD:代收货款; FREIGHT:运费;) */
private String sceneTypes;
/* 产品描述 */
private String productDescription;
/* 产品规则描述 */
private String productRoleDescription;
/* 放款触发行为 */
private String loanAction;
/* 收款触发行为 */
private String repayAction;
/* 产品状态(ENABLE:启用; DISABLE:停用;) */
private String productStatus;
/* 预警阀值 */
private Long warnBalance;
/* 发货人是否控制额度(1:是; 0:否;) */
private Integer isConsignerCreditLimit;
/* 承运商是否控制额度(1:是; 0:否;) */
private Integer isExpressCreditLimit; private String productAgreementUrl; private String poundageCalcType; private String poundageRate; /* 备注1 */
private String remark1;
/* 操作员编号 */
private String operatorId;
/* 输入日期 */
private Date inputDate;
/* 记录更新时间 */
private Date stampDate; }
BeanCopier
Mapper wrapper = new DozerBeanMapper();
ProductDTO pdt = new ProductDTO();
pdt.setIsConsignerCreditLimit(3);
pdt.setLoanAction("323f3");
pdt.setProductName("feiwefe");
pdt.setPoundageRate("f332r3");
long beg = System.currentTimeMillis();
PropertyUtilsBean bean = new PropertyUtilsBean(); BeanCopier copier = BeanCopier.create(ProductDTO.class, LfProduct.class, false);
for (int i=0;i<1000;i++) {
LfProduct lfPdt = new LfProduct();
// try {
// try {
// bean.copyProperties(lfPdt, pdt);
// } catch (IllegalAccessException | InvocationTargetException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// } catch (NoSuchMethodException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
copier.copy(pdt, lfPdt, null);
if (i==3) {
// System.out.println(JacksonHelper.toJSON(lfPdt));
}
// lfPdt = wrapper.map(pdt, LfProduct.class);
lfPdt.setInputDate(new Date());
}
System.out.println(System.currentTimeMillis() - beg);
大约140ms左右。
Mapper wrapper = new DozerBeanMapper();
ProductDTO pdt = new ProductDTO();
pdt.setIsConsignerCreditLimit(3);
pdt.setLoanAction("323f3");
pdt.setProductName("feiwefe");
pdt.setPoundageRate("f332r3");
long beg = System.currentTimeMillis();
PropertyUtilsBean bean = new PropertyUtilsBean(); BeanCopier copier = BeanCopier.create(ProductDTO.class, LfProduct.class, false);
for (int i=0;i<1000;i++) {
LfProduct lfPdt = null;
// try {
// try {
// bean.copyProperties(lfPdt, pdt);
// } catch (IllegalAccessException | InvocationTargetException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// } catch (NoSuchMethodException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// copier.copy(pdt, lfPdt, null);
if (i==3) {
// System.out.println(JacksonHelper.toJSON(lfPdt));
}
lfPdt = wrapper.map(pdt, LfProduct.class);
lfPdt.setInputDate(new Date());
}
System.out.println(System.currentTimeMillis() - beg);
2500ms。
PropertyUtilsBean
Mapper wrapper = new DozerBeanMapper();
ProductDTO pdt = new ProductDTO();
pdt.setIsConsignerCreditLimit(3);
pdt.setLoanAction("323f3");
pdt.setProductName("feiwefe");
pdt.setPoundageRate("f332r3");
long beg = System.currentTimeMillis();
PropertyUtilsBean bean = new PropertyUtilsBean(); BeanCopier copier = BeanCopier.create(ProductDTO.class, LfProduct.class, false);
for (int i=0;i<1000;i++) {
LfProduct lfPdt = new LfProduct();
try {
try {
bean.copyProperties(lfPdt, pdt);
} catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// copier.copy(pdt, lfPdt, null);
if (i==3) {
// System.out.println(JacksonHelper.toJSON(lfPdt));
}
// lfPdt = wrapper.map(pdt, LfProduct.class);
lfPdt.setInputDate(new Date());
}
System.out.println(System.currentTimeMillis() - beg);
240ms左右。
所以,因为绝大部分都是简单的复制拷贝,这种情况下,BeanCopyer>PropertyUtils>Dozer。
参考:
http://blog.csdn.net/jianhua0902/article/details/8155368
http://blog.csdn.net/liangrui1988/article/details/41802275
java bean属性拷贝工具类比对(性能+功能)的更多相关文章
- 对象属性拷贝工具类大全==>Bean的属性拷贝从此不用愁
大家在做java开发时,肯定会遇到api层参数对象传递给服务层,或者把service层的对象传递给dao层,他们之间又不是同一个类型对象,但字段又是一样,如果还是用普通的get.set方式来处理话,比 ...
- 一个Bean属性拷贝的工具类
package com.fpi.spring.qaepb.cps.util; import java.beans.IntrospectionException; import java.beans.P ...
- java bean对象拷贝
Java的bean的属性复制,大家可以都看一下. 谈谈Java开发中的对象拷贝http://www.wtnull.com/view/2/e6a7a8818da742758bcd8b73d49d6be2 ...
- java Bean的映射工具
数据层,业务逻辑层和表现层,每一层对应的应该是不一样的对象,所以就有个这么个java bean的映射工具 dozer.......................................... ...
- Github 开源:高效好用的对象间属性拷贝工具:升讯威 Mapper( Sheng.Mapper)
Github 地址:https://github.com/iccb1013/Sheng.Mapper 对象属性值映射/拷贝工具.不需要创建映射规则,不要求对象类型一致,适用于简单直接的拷贝操作,可以全 ...
- Java bean常见映射工具分析和比较
1. 概述 日常Java开发项目中,我们经常需要将对象转换成其他形式的对象,因此我们需要编写映射代码将对象中的属性值从一种类型转换成另一种类型. 进行这种转换除了手动编写大量的get/set代码,还可 ...
- java bean 属性验证框架 valid
项目介绍 java 开发中,参数校验是非常常见的需求. 但是 hibernate-validator 在使用过程中,依然会存在一些问题. 特性 支持 fluent-validation 支持 jsr- ...
- java读取属性配置文件工具类
import java.io.IOException; import java.io.InputStream; import java.util.Properties; /** * * 类: ProU ...
- idea中使用插件lombok简化java bean的getter/setter/log等常用功能
一.安装. 1. 2. 3. 4. . 二.使用 1. 2. 3. 结果分析,如果没有添加@Setter注解,则LombokTest中的student示例无法使用setAge()等方法.使用lombo ...
随机推荐
- Linux系统查看日志信息总结
命令: cat tail -f #系统日志文件存放路径: /var/log/message #系统启动后的信息和错误日志 /var/log/secure #与安全相关的日志信息 /var/log/ma ...
- js判断手机是安卓还是ios
//点击下载按钮判断appDown() { var u = navigator.userAgent; var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac O ...
- 安装程序无法打开注册表项 UNKNOWN\Components\…的简单解决办法(转)
安装程序无法打开注册表项 UNKNOWN\Components\…的简单解决办法 2018年04月16日 16:41:32 super_star_贤 阅读数:7193 在安装软件时(比如安装SQL ...
- Struts2自定义Field级别的错误提示信息
自定义Field级别的错误提示信息步骤: 在action包中新建一个以Action命名的properties文件,如:RegisterAction.properties 2. 然后在该属性文件中指定每 ...
- Steam API调试
概览 经过这些年,Steam 已经成长为一款大型应用程序,提供多款调试用单独模块及方法.本文将尽量向您呈现这些模块与方法,帮助您充分利用 Steam 与 Steamworks,减少烦恼. Steam ...
- 类中静态成员变量 && 无法解析的外部符号
[1]如下代码及编译错误 如标题,不做赘述. [2]原因及解决方案 原因:之所以报如上编译错误,因为静态成员变量未初始化. 解决方案:类中静态成员需要在类外进行初始化.其格式为:类型 类名::静态成员 ...
- arm cortex-m0plus源码学习(一)整体框架
Cortex-M0 分别是系统.电源管理.时钟.复位 由于.cm0p_ik_defs.v里 `define ARM_CM0PIK_IOP 0,这里的gpio是ahb接口的,画叉的部分没有例化. ah ...
- GO富集分析
GO的主要用途之一是对基因组进行富集分析.例如,给定一组在特定条件下上调的基因,富集分析将使用该基因组的注释发现哪些GO术语被过度表示(或未充分表示). 富集分析工具 用户可以直接从GOC网站的 ...
- 基于word2vec训练词向量(一)
转自:https://blog.csdn.net/fendouaini/article/details/79905328 1.回顾DNN训练词向量 上次说到了通过DNN模型训练词获得词向量,这次来讲解 ...
- 微信小程序制作家庭记账本之四
第四天,仍然对记账本代码进行研究,对按钮的大小设置,颜色,具体位置进行分析,但其中很多代码都不明白.