BeanCopier类[通俗易懂]

BeanCopier类[通俗易懂]网上学习了一番BeanCopier类。cglib是一款比较底层的操作java字节码的框架。下面通过拷贝bean对象来测试BeanCopier的特性:publicclassOrderEntity{privateintid;privateStringname;//Gettersandsettersareom…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

网上学习了一番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会失败而导致拷贝不成功。

转载于:https://www.cnblogs.com/qiuhaojie/p/6856341.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197148.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【自考】数据结构导论「建议收藏」

    【自考】数据结构导论「建议收藏」第一遍导图第一章第二.三章第四章第五章第六章第七章 

    2022年8月18日
    6
  • 微信小程序服务器端登录注册验证「建议收藏」

    微信小程序服务器端登录注册验证「建议收藏」$data=[ ‘name’=>$name, ‘number’=>$number, ‘code’=>$code];$rule=[ ‘name’=>’require’ ‘number’=>’require|number|lenght:10,11’, ‘code’=>’require’];$errMsg=[ ‘name’=>’姓名必填’, ‘number.require’=>’学号必填’, ‘number.number’=>

    2022年7月16日
    19
  • mysql phpmyadmin配置_phpmyadmin 配置方法与安装教程[通俗易懂]

    mysql phpmyadmin配置_phpmyadmin 配置方法与安装教程[通俗易懂]今天我们来看看phpmyadmin配置教程吧,也可以叫做phpmyadmin安装吧,安装我就不说了,你直接到网上下载一个phpmyadmin包解压到你的站点目录,就行了.下面我们来看个简单的例子吧.安装目录:/admin/好了我们现在打开我们刚才解压的文件夹找到config.sample.inc.php把它改名为config.inc.php下面我们就打开这个文件.找到$cfg[‘PmaAbs…

    2022年5月6日
    33
  • Dubbo负载均衡策略之 一致性哈希

    Dubbo负载均衡策略之 一致性哈希Dubbo负载均衡策略之一致性哈希1负载均衡在这里引用dubbo官网的一段话——LoadBalance中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载“均摊”到不同的机器上。避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况。通过负载均衡,可以让每台服务器获取到适合自己处理能力的负载。在为高负载服务器分流的同时,还可以避免资源浪费,一举两得。负载均衡可分为软件负载均衡和硬件负载均衡。在我们日常开发中,一般很难接触到硬件负载均衡。但软件负载均衡还是可以接触到的,比如Nginx

    2022年7月27日
    9
  • stat函数详解

    Linux系统函数之文件系统管理(二)stat函数​作用:获取文件信息​头文件:include&lt;sys/types.h&gt;#include&lt;sys/stat.h&gt;#include&lt;unistd.h&gt;​函数原型:intstat(constchar*path,structstat*buf)​返回值:成功返…

    2022年4月5日
    46
  • spring ehcache配置以及使用(afterPropertiesSet)

    spring配置ehcache例子:[url]http://blog.csdn.net/linfanhehe/article/details/7693091[/url][color=red][b]主要特性[/b][/color]1.快速.2.简单.[b]3.多种缓存策略[/b]4.缓存数据有两级:内存和磁盘,因此无需担心…

    2022年4月7日
    121

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号