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 ...
随机推荐
- Java——集合类
1.容器的打印 import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import jav ...
- Spring Boot Security Oauth2之客户端模式及密码模式实现
Spring Boot Security Oauth2之客户端模式及密码模式实现 示例主要内容 1.多认证模式(密码模式.客户端模式) 2.token存到redis支持 3.资源保护 4.密码模式用户 ...
- Sqlserver 查询把多行内容拼成一个字符串
当使用:SELECT ','+Id FROM dbo.Test FOR XML PATH('')); //这样读取的数据虽然是1,2,3,4,但是仍然是xml格式,所以当数据超过2033时候,用sql ...
- .net必问的面试题系列之面向对象
上个月离职了,这几天整理了一些常见的面试题,整理成一个系列给大家分享一下,机会是给有准备的人,面试造火箭,工作拧螺丝,不慌,共勉. 1.net必问的面试题系列之基本概念和语法 2.net必问的面试题系 ...
- RestTemplate最详解
目录 1. RestTemplate简单使用 2. 一些其他设置 3. 简单总结 在项目中,当我们需要远程调用一个HTTP接口时,我们经常会用到RestTemplate这个类.这个类是Spring框架 ...
- windows安装elasticsearch服务以及elasticsearch5.6.10集群的配置(elasticsearch5.6.10配置跟1.1.1的配置不太相同,有些1.1.1版本下的配置指令在5.6.10中不能使用)
1.下载elasticsearch5.6.10安装包 下载地址为: https://artifacts.elastic.co/downloads/elasticsearch/elasticsearc ...
- unity编辑器扩展_05(删除游戏对象并具有撤回功能)
代码: [MenuItem("Tools/Delete",false,1)] static void Delete() { GameObject[] go ...
- 2013-2014 ACM-ICPC Pacific Northwest Regional Contest L.Languages
题意略. 思路: 这种字符串的模拟题,应该熟练使用stringstream. 详见代码: #include<bits/stdc++.h> using namespace std; map& ...
- ElasticSearch:组合查询或复合查询
Bool查询 允许在单独的查询中组合任意数量的查询,指定的查询语句表名哪些部分是必须匹配(must).应该匹配(should)或不能匹配(must_not) Bool过滤器 和查询功能一致,但是同等情 ...
- LuoGu-P2863牛的舞会The Cow Prom[tarjan 缩点模板]
传送门:https://www.luogu.org/problemnew/show/P2863 思路:tarjan模板题,之前会的tarjan,一直想学缩点到底是什么操作,发现就是把同组的放在一个数组 ...