BeanCopier类
网上学习了一番BeanCopier类。
cglib是一款比较底层的操作java字节码的框架。
下面通过拷贝bean对象来测试BeanCopier的特性:
- public class OrderEntity {
- private int id;
- private String name;
- // Getters and setters are omitted
- }
- public class OrderDto {
- private int id;
- private String name;
- // Getters and setters are omitted
- }
- public class PropWithDiffType {
- private Integer id;
- private String name;
- // Getters and setters are omitted
- }
- public class LackOfSetter {
- private int id;
- private String name;
- public LackOfSetter() {
- }
- public LackOfSetter(int id, String name) {
- this.id = id;
- this.name = name;
- }
- // Getters and setters are omitted
- // public void setName(String name) {
- // this.name = name;
- // }
- }
1. 属性名称、类型都相同:
- @Test
- public void normalCopyTest() {
- OrderEntity entity = new OrderEntity();
- entity.setId(1);
- entity.setName("orderName");
- final BeanCopier copier = BeanCopier.create(OrderEntity.class, OrderDto.class, false);
- OrderDto dto = new OrderDto();
- copier.copy(entity, dto, null);
- Assert.assertEquals(1, dto.getId());
- Assert.assertEquals("orderName", dto.getName());
- }
结论:拷贝OK。
2. 属性名称相同、类型不同:
- @Test
- public void sameNameDifferentTypeCopyTest() {
- OrderEntity entity = new OrderEntity();
- entity.setId(1);
- entity.setName("orderName");
- final BeanCopier copier = BeanCopier.create(OrderEntity.class, PropWithDiffType.class, false);
- PropWithDiffType dto = new PropWithDiffType();
- copier.copy(entity, dto, null);
- Assert.assertEquals(null, dto.getId()); // OrderEntity的id为int类型,而PropWithDiffType的id为Integer类型,不拷贝
- Assert.assertEquals("orderName", dto.getName());
- }
结论:名称相同而类型不同的属性不会被拷贝。
注意:即使源类型是原始类型(int, short和char等),目标类型是其包装类型(Integer, Short和Character等),或反之:都不会被拷贝。
3. 源类和目标类有相同的属性(两者的getter都存在),但目标类的setter不存在
- @Test
- public void targetLackOfSetterCopyTest() {
- OrderEntity entity = new OrderEntity();
- entity.setId(1);
- entity.setName("orderName");
- final BeanCopier copier = BeanCopier.create(OrderEntity.class, LackOfSetter.class, false); // 抛NullPointerException
- LackOfSetter dto = new LackOfSetter();
- copier.copy(entity, dto, null);
- }
结论:创建BeanCopier的时候抛异常。
导致异常的原因是BeanCopier类的第128~133行
- for (int i = 0; i < setters.length; i++) { // 遍历目标类的属性描述集
- PropertyDescriptor setter = setters[i];
- PropertyDescriptor getter = (PropertyDescriptor)names.get(setter.getName()); // 从源类获取和目标类属性名称相同的属性描述
- if (getter != null) {
- MethodInfo read = ReflectUtils.getMethodInfo(getter.getReadMethod()); // 获取源类属性的getter方法
- MethodInfo write = ReflectUtils.getMethodInfo(setter.getWriteMethod()); // 获取目标类属性的setter方法。LackOfSetter类name属性的setter方法没有,所以报错
4. 源类或目标类的setter比getter少
- @Test
- public void sourceLackOfSetterCopyTest() {
- LackOfSetter source = new LackOfSetter(1, "throne");
- final BeanCopier copier = BeanCopier.create(LackOfSetter.class, OrderDto.class, false);
- OrderDto dto = new OrderDto();
- copier.copy(source, dto, null);
- Assert.assertEquals(1, dto.getId());
- Assert.assertEquals("throne", dto.getName());
- }
结论:拷贝OK。此时的setter多余,但不会报错。
总结:
1. BeanCopier只拷贝名称和类型都相同的属性。 其实,究其原因还是
- BeanCopier copier = BeanCopier.create(OrderEntity.class, PropWithDiffType.class, false);
最后一个参数useConverter:false,就表示只拷贝同名同类型的属性。但是如果使用useConverter,就要自己根据converter中的规则来进行拷贝。
引用他人的文章http://czj4451.iteye.com/blog/2044101
2. 当目标类的setter数目比getter少时,创建BeanCopier会失败而导致拷贝不成功。
BeanCopier类的更多相关文章
- BeanCopier
cglib是一款比较底层的操作java字节码的框架. 下面通过拷贝bean对象来测试BeanCopier的特性: public class OrderEntity { private int id; ...
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
- 常见Bean映射工具分析评测及Orika介绍
原地址:http://tech.dianwoda.com/2017/11/04/gao-xing-neng-te-xing-feng-fu-de-beanying-she-gong-ju-orika/ ...
- Java bean常见映射工具分析和比较
1. 概述 日常Java开发项目中,我们经常需要将对象转换成其他形式的对象,因此我们需要编写映射代码将对象中的属性值从一种类型转换成另一种类型. 进行这种转换除了手动编写大量的get/set代码,还可 ...
- 使用 BeanCopier 复制对象
Cglib是一款比较底层的操作java字节码的框架. BeanCopier是一个工具类,可以用于Bean对象内容的复制. 复制Bean对象内容的方法有很多,比如自己手动get set ,或者使用Pro ...
- [性能] Bean拷贝工具类性能比较
Bean拷贝工具类性能比较 引言 几年前做过一个项目,接入新的api接口.为了和api实现解耦,决定将api返回的实体类在本地也建一个.这样做有两个好处 可以在api变更字段的时候保持应用稳定性 可以 ...
- 对象拷贝类PropertyUtils,BeanUtils,BeanCopier的技术沉淀
功能简介 对象拷贝的应用现状简介: 业务系统中经常需要两个对象进行属性的拷贝,不能否认逐个的对象拷贝是最快速最安全的做法,但是当数据对象的属性字段数量超过程序员的容忍的程度,代码因此变得臃肿不堪,使用 ...
- 自己通过反射写的一个属性copy类
package com.xxx.beancopier; import java.lang.annotation.Documented; import java.lang.annotation.Elem ...
- 基于Emit实现的C#版本的BeanCopier
在java的技术栈当中,著名的Cglib库里面有一个BeanCopier,这个类的功能就是可以完成两个对象的属性复制工作(哪怕属于两个不同的类). 今天本人通过.net内置的System.Reflec ...
随机推荐
- 重读《学习JavaScript数据结构与算法-第三版》- 第3章 数组(一)
定场诗 大将生来胆气豪,腰横秋水雁翎刀. 风吹鼍鼓山河动,电闪旌旗日月高. 天上麒麟原有种,穴中蝼蚁岂能逃. 太平待诏归来日,朕与先生解战袍. 此处应该有掌声... 前言 读<学习JavaScr ...
- 深入理解 linux磁盘顺序写、随机写
一.前言 ● 随机写会导致磁头不停地换道,造成效率的极大降低:顺序写磁头几乎不用换道,或者换道的时间很短 ● 本文来讨论一下两者具体的差别以及相应的内核调用 二.环境准备 组件 版本 OS Ubunt ...
- 带图标和多行显示的ListBox
源码https://www.codeproject.com/Articles/15464/Extending-the-ListBox-to-show-more-complex-items 定义控件 u ...
- 防抖(debounce)和节流(throttle)
场景说明:一般我们在前端页面中会给元素绑定click.scroll.onmousemove.resize等事件,这些事件的执行函数如果是去发请求获取数据的话,我们无意识的连续点击或者连续滚动会给服务器 ...
- Day 02--选题与设计(二)
1.今天我们主要设计了一下我们微信小程序可以实现的功能,客户操作的基本流程,研究了墨刀这个工具的使用方法并试着将想法转化为原型设计项目.我们给自己的系统起名为“天天好餐”.我们认为食堂订送餐与网络上的 ...
- Scrapy爬虫框架学习
一.Scrapy框架简介 1. 下载页面 2. 解析 3. 并发 4. 深度 二.安装 linux下安装 pip3 install scrapy windows下安装 a.pip3 install w ...
- java 正则 替换中文为空
//中文替换为"" public String replaceChineseToNULL(String s){ String reg = "[\u4e00-\u9fa5] ...
- 纯css、js 的H5页面对接echarts
做项目时,会遇到一些零碎的技术点.记录下来以防忘记 需求:做可视化界面,但是需要兼容ie8,需要用纯css.js 的H5页面对接echarts,下面为效果图(带定时器循环显示tooltip). 实现方 ...
- Mybatis与SQL Server类型转换遇到的坑
一. MyBatis SQL语句遇到的性能问题 1. 场景还原 假设我们有一张User表,其中包含userId.userName.gender字段,其中userId的数据类型为char(20),此时我 ...
- macbook 安装redis流程及问题总结
Mac安装redis流程和总结 一.redis安装流程: 1.进入redis官网-->点击download-->选择稳定版本(stable)-->点击Download即可. 2.将下 ...