码迷,mamicode.com
首页 > 其他好文 > 详细

BeanCopier

时间:2017-05-27 12:20:03      阅读:350      评论:0      收藏:0      [点我收藏+]

标签:ring   tar   creat   原因   and   script   exce   art   highlight   

cglib是一款比较底层的操作java字节码的框架。 

下面通过拷贝bean对象来测试BeanCopier的特性: 

Java代码  技术分享
  1. public class OrderEntity {  
  2.     private int id;  
  3.     private String name;  
  4.     // Getters and setters are omitted  
  5. }  

 

Java代码  技术分享
  1. public class OrderDto {  
  2.     private int id;  
  3.     private String name;  
  4.     // Getters and setters are omitted  
  5. }  

 

Java代码  技术分享
  1. public class PropWithDiffType {  
  2.     private Integer id;  
  3.     private String name;  
  4.     // Getters and setters are omitted  
  5. }  

 

Java代码  技术分享
  1. public class LackOfSetter {  
  2.     private int id;  
  3.     private String name;  
  4.   
  5.     public LackOfSetter() {  
  6.     }  
  7.   
  8.     public LackOfSetter(int id, String name) {  
  9.         this.id = id;  
  10.         this.name = name;  
  11.     }  
  12.     // Getters and setters are omitted  
  13.     // public void setName(String name) {  
  14.     //  this.name = name;  
  15.     // }  
  16. }  



1. 属性名称、类型都相同: 

Java代码  技术分享
  1. @Test  
  2. public void normalCopyTest() {  
  3.     OrderEntity entity = new OrderEntity();  
  4.     entity.setId(1);  
  5.     entity.setName("orderName");  
  6.     final BeanCopier copier = BeanCopier.create(OrderEntity.class, OrderDto.class, false);  
  7.     OrderDto dto = new OrderDto();  
  8.     copier.copy(entity, dto, null);  
  9.     Assert.assertEquals(1, dto.getId());  
  10.     Assert.assertEquals("orderName", dto.getName());  
  11. }  


结论:拷贝OK。 

2. 属性名称相同、类型不同: 

Java代码  技术分享
  1. @Test  
  2. public void sameNameDifferentTypeCopyTest() {  
  3.     OrderEntity entity = new OrderEntity();  
  4.     entity.setId(1);  
  5.     entity.setName("orderName");  
  6.     final BeanCopier copier = BeanCopier.create(OrderEntity.class, PropWithDiffType.class, false);  
  7.     PropWithDiffType dto = new PropWithDiffType();  
  8.     copier.copy(entity, dto, null);  
  9.     Assert.assertEquals(null, dto.getId()); // OrderEntity的id为int类型,而PropWithDiffType的id为Integer类型,不拷贝  
  10.     Assert.assertEquals("orderName", dto.getName());  
  11. }  


结论:名称相同而类型不同的属性不会被拷贝。 

注意:即使源类型是原始类型(int, short和char等),目标类型是其包装类型(Integer, Short和Character等),或反之:都不会被拷贝。 

3. 源类和目标类有相同的属性(两者的getter都存在),但目标类的setter不存在 

Java代码  技术分享
  1. @Test  
  2. public void targetLackOfSetterCopyTest() {  
  3.     OrderEntity entity = new OrderEntity();  
  4.     entity.setId(1);  
  5.     entity.setName("orderName");  
  6.     final BeanCopier copier = BeanCopier.create(OrderEntity.class, LackOfSetter.class, false);  // 抛NullPointerException  
  7.     LackOfSetter dto = new LackOfSetter();  
  8.     copier.copy(entity, dto, null);  
  9. }  


结论:创建BeanCopier的时候抛异常。 

导致异常的原因是BeanCopier类的第128~133行 

Java代码  技术分享
  1. for (int i = 0; i < setters.length; i++) { // 遍历目标类的属性描述集  
  2.     PropertyDescriptor setter = setters[i];  
  3.     PropertyDescriptor getter = (PropertyDescriptor)names.get(setter.getName()); // 从源类获取和目标类属性名称相同的属性描述  
  4.     if (getter != null) {  
  5.         MethodInfo read = ReflectUtils.getMethodInfo(getter.getReadMethod()); // 获取源类属性的getter方法  
  6.         MethodInfo write = ReflectUtils.getMethodInfo(setter.getWriteMethod()); // 获取目标类属性的setter方法。LackOfSetter类name属性的setter方法没有,所以报错  



4. 源类或目标类的setter比getter少 

Java代码  技术分享
  1. @Test  
  2. public void sourceLackOfSetterCopyTest() {  
  3.     LackOfSetter source = new LackOfSetter(1, "throne");  
  4.     final BeanCopier copier = BeanCopier.create(LackOfSetter.class, OrderDto.class, false);  
  5.     OrderDto dto = new OrderDto();  
  6.     copier.copy(source, dto, null);  
  7.     Assert.assertEquals(1, dto.getId());  
  8.     Assert.assertEquals("throne", dto.getName());  
  9. }  


结论:拷贝OK。此时的setter多余,但不会报错。 

总结: 

1. BeanCopier只拷贝名称和类型都相同的属性。 

2. 当目标类的setter数目比getter少时,创建BeanCopier会失败而导致拷贝不成功。

BeanCopier

标签:ring   tar   creat   原因   and   script   exce   art   highlight   

原文地址:http://www.cnblogs.com/carlos-liye/p/6912154.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!