BeanUtils.copyProperties(org.springframework.beans.BeanUtils) 和 BeanUtil.copyProperties( Hutool)

一、BeanUtils.copyProperties(source,target);

1、使用

将source的属性复制给target,但是这里只针对target中和source相同的字段或属性。
如source类为A中有字段:id、name、age;
target类为B中有字段:id、name
A a=new A();
B b=new B();
a.setId(1);
a.setName(“Arya”);
a.setAge(11);
BeanUtils.copyProperties(a,b);
结果b的id为1、name为Arya

2、使用情景(Spring 框架下的org.springframework.beans.BeanUtils)

BeanUtils它提供了对java反射和自省API的包装。它里面还有很多工具类,一般当我们有两个具有很多相同属性的JavaBean实体类时,传统的方式对属性逐个赋值:依次的进行set,get但是这样的赋值方式,是非常麻烦的,而且重复代码量可以会很多,很冗余。而这时我们就可以使用BeanUtils.copyProperties()方法
并且用起来很方便,一行代码就可以搞定,简单明了:

//source:源; 目标:target
BeanUtils.copyProperties(Object source, Object target); 
=> BeanUtils.copyProperties("转换前的类", "转换后的类");

Spring的BeanUtils的CopyProperties方法需要对应的属性有getter和setter方法;如果存在属性完全相同的内部类,但是不是同一个内部类,即分别属于各自的内部类,则spring会认为属性不同,不会copy;spring和apache的copy属性的方法源和目的参数的位置正好相反,所以导包和调用的时候都要注意一下。

二、BeanUtils.copyProperties(org.springframework.beans.BeanUtils) 和 BeanUtil.copyProperties( Hutool提供) 区别

1)使用BeanUtils 实现属性拷贝,在类型不同时,会忽略 target 对象相同命名的参数(即字段名称一致但字段类型不同),而 Hutool 提供的BeanUtil则不会忽略。

BeanUtils.copyProperties 无法转换数据类型不同的数据,因类型不一致,所以数据复制失败。
这是因为:spring在利用反射复制对象时,是以javaBean的规范来使用get/set方法进行设置值的。
同时set方法的参与类型,在classLoader中,也会被计为函数名的一部分。
(使用BeanUtils.copyProperties时,底层使用了大量的反射机制,导致类加载器和类的元信息过多,最终可能会导致OOM)

所有这里必须都是同类型,否则spring就不会对该属性进行复制相应的值。

【解决1 : 使用fastJson】

导入依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.78</version>
</dependency>

b = JSONObject.parseObject(JSONObject.toJSONString(a),B.class);

2)BeanUtil.copyProperties虽然字段类型不一样,但是做了兼容处理,所以业务没有影响业务逻辑。

三、 浅拷贝的现象就是对象指向同一个内存地址,修改了拷贝前的对象的值就会影响拷贝后的值,这两个只能算是简单的属性复制并不能算浅拷贝或深拷贝。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,可以得知BeanUtils.copyProperties()方法存在于两个不同的类中,分别为org.springframework.beans.BeanUtilsorg.apache.commons.beanutils.BeanUtils。这两个类的copyProperties()方法传递参数的赋值是相反的,即在org.springframework.beans.BeanUtils中,copyProperties(A,B)的结果是将A拷贝到B;而在org.apache.commons.beanutils.BeanUtils中,copyProperties(A,B)的结果是将B拷贝到A。 因此,如果需要使用BeanUtils.copyProperties()方法,需要先确定使用的是哪个类中的方法,并根据需要传递正确的参数。 下面是两个类中copyProperties()方法的使用示例: 1. org.springframework.beans.BeanUtils中的copyProperties()方法,将A对象的属性值拷贝到B对象中: ```python from myapp.models import A, B from django.shortcuts import get_object_or_404 from django.http import HttpResponse from org.springframework.beans import BeanUtils def my_view(request, pk): a = get_object_or_404(A, pk=pk) b = B() BeanUtils.copyProperties(a, b) b.save() return HttpResponse('Copy successful!') ``` 2. org.apache.commons.beanutils.BeanUtils中的copyProperties()方法,将B对象的属性值拷贝到A对象中: ```python from myapp.models import A, B from django.shortcuts import get_object_or_404 from django.http import HttpResponse from org.apache.commons.beanutils import BeanUtils def my_view(request, pk): a = A() b = get_object_or_404(B, pk=pk) BeanUtils.copyProperties(a, b) a.save() return HttpResponse('Copy successful!') ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值