一、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虽然字段类型不一样,但是做了兼容处理,所以业务没有影响业务逻辑。