java对象属性复制的几种方式

java对象属性复制的几种方式
1.使用java反射机制,获取对象的属性和get、set方法进行复制;

2.使用spring-beans5.0.8包中的BeanUtils类

import org.springframework.beans.BeanUtils;

SourceObject sourceObject = new SourceObject();
TargetObject targetObject = new TargetObject();
BeanUtils.copyProperties(sourceObject, targetObject);

3.使用cglib3.2.8包中的net.sf.cglib.beans.BeanCopier类

import net.sf.cglib.beans.BeanCopier;
import net.sf.cglib.core.Converter;
SourceObject sourceObject = new SourceObject();
TargetObject targetObject = new TargetObject();
BeanCopier beanCopier = BeanCopier.create(SourceObject.class, TargetObject.class, true);–第三个参数表示是否使用转换器,false表示不使用,true表示使用
Converter converter = new CopyConverter();–自定义转换器
beanCopier.copy(sourceObject, targetObject, converter);

转换器(当源对象属性类型与目标对象属性类型不一致时,使用转换器):
import net.sf.cglib.core.Converter;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.util.Date;

/**

  • Created by asus on 2019/7/12.
    */
    public class CopyConverter implements Converter {

    @Override
    public Object convert(Object value, Class target, Object context) {
    {
    String s = value.toString();
    if (target.equals(int.class) || target.equals(Integer.class)) {
    return Integer.parseInt(s);
    }
    if (target.equals(long.class) || target.equals(Long.class)) {
    return Long.parseLong(s);
    }
    if (target.equals(float.class) || target.equals(Float.class)) {
    return Float.parseFloat(s);
    }
    if (target.equals(double.class) || target.equals(Double.class)) {
    return Double.parseDouble(s);
    }
    if(target.equals(Date.class)){
    while(s.indexOf("-")>0){
    s = s.replace("-", “/”);
    }
    return new Date(s);
    }
    if(target.equals(BigDecimal.class)){
    if(!StringUtils.isEmpty(s)&&!s.equals(“NaN”)){
    return new BigDecimal(s);
    }
    }
    return value ;

     }
    

    }
    }

4.使用spring-core5.0.8包中的org.springframework.cglib.beans.BeanCopier类(用法与第三种一样)

import org.springframework.cglib.beans.BeanCopier;
import org.springframework.cglib.core.Converter;
SourceObject sourceObject = new SourceObject();
TargetObject targetObject = new TargetObject();
Converter converter = new SpringCopyConverter();
BeanCopier beanCopier = BeanCopier.create(SourceObject.class, TargetObject.class, true);
beanCopier.copy(sourceObject, targetObject, converter);

经过循环复制测试(源对象与目标对象各160个属性):
在这里插入图片描述
补充:

第一种:Java反射通过判断属性类型,常用类型的属性值都能复制,但是不优化的前提下效率最慢;

第二种:属性类型不同时无法复制,且效率相对较慢;

第三种:耗时最少,不使用转换器时,属性类型不同时无法复制,使用转换器后,耗时会相对变长;

第四种:与第三种相似,但是耗时相对较长;

大家在日常的java开发中,经常会使用到对象之间属性的赋值操作,如果两个对象之间复制的属性不多的时候,我们一般都会使用java提供的get、set方法进行复制。但是碰到对象的属性数量特别多的时候(业务代码对象动辄几十上百个属性),属性复制手工输入上百个get、set将会特别耗时耗力。
  如何使用一句简单的代码直接复制上百个属性,这里介绍几种常用的方法,以及本人在实际项目中碰到的一个坑。

使用org.apache.commons.beanutils.BeanUtils.copyProperties(Object
dest, Object orig); dest目标对象,orig源对象。(这个方法比较坑,耗时严重,之后介绍)
使用org.springframework.beans.BeanUtils.copyProperties(Object source,
Object target); source源对象,target对象。(注意和apache的是反过来的) 1.
使用net.sf.cglib.beans.BeanCopier.copy(from, to, null);
先定义BeanCopier beanCopier =BeanCopier.create(“要转换的类”, “转换后的类”, false);   再复制beanCopier.copy(from, to, null);
org.springframework.cglib.beans.BeanCopier.copy(from, to, null);
先定义BeanCopier beanCopier =BeanCopier.create(“要转换的类”, “转换后的类”, false);   再进行复制beanCopier.copy(from, to, null);

本人做了简单的测试,如下:
  JAVA对象复制对比测试
  可以发现org.apache.commons.beanutils.BeanUtils.copyProperties在属性多的情况复制效率严重低下,本人曾使用这个方法也被坑惨了。
  推荐使用spring的beanUtils或者BeanCopier,使用简单方便,效率较高,上百行的属性复制一行搞定,轻松愉快。
  本人也是做了简单的测试,还有其他的坑估计还要进行进一步深入探索。

转载:https://www.cnblogs.com/cyf18/articles/11178869.html
转载: https://blog.csdn.net/xiaoyang226/article/details/81939912

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值