背景

最近开发接口过程中,使用BeanCopier拷贝对象,当对象中嵌套自定义对象类型属性的时候,
如果对象名称一致,但是对象类型不一致,拷贝的时候,该属性是会被忽略的,但是当对象中嵌套List集合类型属性(集合中是不同的对象类型)时,使用BeanCopier拷贝之后,返回给前台的数据是正确的,感觉不太懂其中的原理,就测试了下。

测试过程

  1. 新建几个对象
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ClassA {private String id;private String name;
}@Data
@NoArgsConstructor
@AllArgsConstructor
public class ClassB {private String id;private String name;
}@Data
@NoArgsConstructor
@AllArgsConstructor
public class BeanA {private String name;private List<ClassA> aList;
}F@Data
@NoArgsConstructor
@AllArgsConstructor
public class BeanA1 {private String name;private ClassA className;
}@Data
@NoArgsConstructor
@AllArgsConstructor
public class BeanB {private String name;private List<ClassB> aList;
}Data
@NoArgsConstructor
@AllArgsConstructor
public class BeanB1 {private String name;private ClassB className;
}
  1. 拷贝BeanA1到BeanB1
public static void main(String[] args) {/*** 将cglib生成的代理类的class文件打印到指定目录*/System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "/Users/haiyoung/logs");BeanA1 beanA1 = new BeanA1();beanA1.setName("aaa");beanA1.setClassName(new ClassA("001", "001"));BeanB1 beanB1 = new BeanB1();BeanCopier beanCopier = BeanCopier.create(BeanA1.class, BeanB1.class,false);beanCopier.copy(beanA1, beanB1,null);System.out.println(beanB1);}

转换结果如下图所示:对象类型被忽略

cglib生成的代理类如下所示

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//package org.springframework.cglib.empty;import com.haiyoung.hyweb.beanCopier.BeanA1;
import com.haiyoung.hyweb.beanCopier.BeanB1;
import org.springframework.cglib.beans.BeanCopier;
import org.springframework.cglib.core.Converter;public class Object$$BeanCopierByCGLIB$$c00337e1 extends BeanCopier {public Object$$BeanCopierByCGLIB$$c00337e1() {}public void copy(Object var1, Object var2, Converter var3) {((BeanB1)var2).setName(((BeanA1)var1).getName());}
}

从copy实现代码中可以看到,不同对象类型属性间的拷贝被忽略

  1. 拷贝BeanA到BeanB
public static void main(String[] args) {/*** 将cglib生成的代理类的class文件打印到指定目录*/System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "/Users/haiyoung/logs");BeanA beanA = new BeanA();beanA.setName("aaa");List<ClassA> list = new ArrayList<>();list.add(new ClassA("001", "001"));beanA.setAList(list);BeanB beanB = new BeanB();BeanCopier beanCopier = BeanCopier.create(BeanA.class, BeanB.class,false);beanCopier.copy(beanA, beanB,null);System.out.println(beanB);List<ClassB> list1 = beanB.getAList();System.out.println(list1);//        ClassB classB = list1.get(0);
//
//        System.out.println(classB);}

转换结果如下图所示,list对象类型属性被成功赋值

但是对象beanA和benaB中的List属性,指向相同的引用,当用ClassB接收beanB中的List属性中的对象时,
会报对象强转失败

Exception in thread "main" [ClassA(id=001, name=001)]
java.lang.ClassCastException: com.haiyoung.hyweb.beanCopier.ClassA cannot be cast to com.haiyoung.hyweb.beanCopier.ClassBat com.haiyoung.hyweb.beanCopier.CopyTest.main(CopyTest.java:44)

cglib生成的代理类如下所示

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//package org.springframework.cglib.empty;import com.haiyoung.hyweb.beanCopier.BeanA;
import com.haiyoung.hyweb.beanCopier.BeanB;
import org.springframework.cglib.beans.BeanCopier;
import org.springframework.cglib.core.Converter;public class Object$$BeanCopierByCGLIB$$27129331 extends BeanCopier {public Object$$BeanCopierByCGLIB$$27129331() {}public void copy(Object var1, Object var2, Converter var3) {BeanB var10000 = (BeanB)var2;BeanA var10001 = (BeanA)var1;var10000.setAList(((BeanA)var1).getAList());var10000.setName(var10001.getName());}
}

从copy的实现代码中可以看到,两个对象中的List类型的对象集合属性被成功赋值,但是是引用赋值

结论

BeanCopier对不同对象中的List对象集合类型的属性的拷贝是弱拷贝,而不是深拷贝,如果只是做对象拷贝,然后直接抛出这个对象给前台使用是没有问题的,但是如果这个通过拷贝得到的对象要在代码中进行业务流转,则会报java.lang.ClassCastException 类强转异常

对BeanCopier拷贝对象中List类型属性的思考相关推荐

  1. java集合按大小排序_List集合对象中按照不同属性大小排序的实例

    实例如下: package com.huad.luck; import java.util.arraylist; import java.util.collections; import java.u ...

  2. js 对象中添加新属性

    js 对象中添加新属性 对象数组添加新属性 同名属性会被覆盖,相同属性会去重

  3. js删除数组对象中的某个属性的方法

    模拟数组对象数据 let newArr = [{title:'小明', id:18},{title:'小红', id:16}] 方式一:(for循环)删除数组对象中的某个属性,如删除id属性 for ...

  4. 【关于js数组对象一道题】将数组对象中的英文属性名替换为中文属性名

    将数组对象中的英文属性名替换为中文属性名 const arr = [{name: '张三', age: 18, address: '湖北'}, {name: '李四', age: 18, addres ...

  5. DOM对象中的常用属性(innerHTML属性,innerText属性,className属性,style属性)

    DOM对象中的常用属性 innerHTML属性 innerText属性 className属性 style属性 innerHTML属性 innerHTML属性:用于设置或获取HTML 元素中的内容. ...

  6. BeanUtils只拷贝对象中属性值不为null的属性

    文章目录 问题 解决方法1(引入hutool包) 解决方法2新增方法 问题 在使用beanutils的copyProperties时候想如果参数为null的就不进行复制; 解决方法1(引入hutool ...

  7. 如何查看 el-form-item 的prop属性_PHP 7.4中的类型属性(Typed Properties)

    php中文网最新课程 每日17点准时技术干货分享 在PHP 7.4中添加了类型属性,并对PHP的类型系统进行了重大改进.这些更改是完全可选的,并且不破坏以前的版本. 在这篇文章中,我们将深入了解这个特 ...

  8. @RequestBody接收Json参数 | 用自定义注解对Vo对象中Date类型日期格式校验

    标题太长有木有?主要是为了把问题描述清楚,免得进错文章. 问题描述 昨天测试的同事测试接口的时候,测试出来一个Date类型校验问题. 要求输入的日期格式是:yyyy-MM-dd HH:mm:ss,Vo ...

  9. php properties,PHP 7.4中的类型属性(Typed Properties)

    在PHP 7.4中添加了类型属性,并对PHP的类型系统进行了重大改进.这些更改是完全可选的,并且不破坏以前的版本. 在这篇文章中,我们将深入了解这个特性,但首先让我们总结最重要的几点: ● 它们自PH ...

最新文章

  1. 单机编程c语言,完美的8051单机C语言编程模板.doc
  2. zblog php 指定分类,zblogPHP 为某些分类指定分类模板,后台版方法
  3. 解决后退,清空验证码(其它文本框保留)
  4. Oracle segment啥意思,关于oracle数据库段segment的小结
  5. HTTP中CORS跨域请求的实现(C++|Qt框架实现)
  6. python实现多表格合并_python 如何把两个表格数据,合并为一个呢?
  7. OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
  8. 汇编语言学习--转移指令的原理
  9. 学计算机干眼,​长期使用电脑 小心干眼症
  10. 计算机学院优秀老师颁奖词,给老师的颁奖词
  11. 金融信贷业务-贷中整理
  12. SQL-聚合函数结果作为筛选条件时where与having用法的区别
  13. CSTC2021 WriteUp
  14. P1567统计天数-C++编程解析-数组
  15. jq设置保留两位小数_js保留两位小数方法总结
  16. 5G/NR中RRC的三种状态(idle, active, inactive)
  17. flink sql 如何upsert 到一张hologres表中
  18. VMware 搭建大数据测试平台(CDH6.2.1)
  19. Proteus-中英文对照
  20. T3备份提示原先格式化该文件时所用扇区大小为512

热门文章

  1. WebRequest 和 HttpWebRequest 区别
  2. IDEA打包JavaWeb的War包并部署到Tomcat
  3. 解决以Error: GlobalConfigUtils setMetaData Fail ! 为基础的嵌套问题(包括common troller,commonservice等问题)
  4. 【Hive】什么是数据仓库?数据仓库和数据库有什么关系?
  5. 【迁移学习】特征空间相同、概率分布不同的概念
  6. 涉案金额600万!微粒贷诈骗团伙被警方一锅端
  7. 计算机触摸屏维修,工控触摸屏常见的故障问题和维修方法分别是什么
  8. android动态修改refresh rate,Lenovo k860i 移植Android 4.4 cm11进度记录【下篇--实时更新中】...
  9. 机器学习----决策树(一)
  10. SQL数据库可疑恢复 挂起恢复 置疑恢复 SQL数据库无法附加修复 附加报错 9003