BeanCopier是Cglib包中的一个类,用于对象的复制。

注意:目标对象必须先实例化  而且对象必须要有setter方法

初始化例子:

  1.  
  2. BeanCopier copier = BeanCopier.create(Source.class, Target.class, false);
  3. copier.copy(source, target, null);

第三个参数useConverter,是否开启Convert。默认BeanCopier只会做同名,同类型属性的copier,否则就会报错。如果类型需要转换比如Date转换成String则自定义Convert类实现Convert接口。

下例用到父类Class.isAssignableFrom(子类Class)方法 这个方法用于判断子类是否属于父类,有人问为什么不用instanceOf,instanceOf用于判断类与类直接的关系,而isAssignableFrom可以用于接口直接的子父关系。

父类Class.isAssignableFrom(子类Class)
  1.  
  2. import java.util.Date;
  3.  
  4. import net.sf.cglib.beans.BeanCopier;
  5. import net.sf.cglib.core.Converter;
  6.  
  7. import org.junit.Test;
  8.  
  9. import com.ibm.icu.text.SimpleDateFormat;
  10.  
  11. /**
  12. *
  13. * @author Test
  14. * @createDate 2014-5-31上午09:50:18
  15. * @className BeanCopierTest.java
  16. *
  17. */
  18. public class BeanCopierTest {
  19. @Test
  20. public void beanCopierTest() {
  21. Address1 a1 = new Address1("LA", new Date());
  22. Address1 a2 = new Address1();
  23. a2 = a1;
  24. // 这种复制修改会造成a1对象的数据进行修改
  25. a2.setName("WA");
  26. System.out.println(a1);
  27.  
  28. Address2 a3 = new Address2();
  29. // 这样就只能使用其他拷贝方法 BeanCopier
  30. BeanCopier beanCopier = BeanCopier.create(Address1.class,
  31. Address2.class, true);
  32. beanCopier.copy(a1, a3, new DateStringConverter());
  33. System.out.println(a3);
  34. System.out.println(a1);
  35. }
  36. }
  37.  
  38. class Address1 {
  39. private String name;
  40. private Date date;
  41.  
  42. public Address1() {
  43. }
  44.  
  45. public Address1(String name, Date date) {
  46. super();
  47. this.name = name;
  48. this.date = date;
  49. }
  50.  
  51. public String getName() {
  52. return name;
  53. }
  54.  
  55. public void setName(String name) {
  56. this.name = name;
  57. }
  58.  
  59. public Date getDate() {
  60. return date;
  61. }
  62.  
  63. public void setDate(Date date) {
  64. this.date = date;
  65. }
  66.  
  67. @Override
  68. public String toString() {
  69. return "名字:" + this.name + " 时间:" + this.date;
  70. }
  71. }
  72.  
  73. class Address2 {
  74. private int id;
  75. private String name;
  76. private String date;
  77.  
  78. public Address2() {
  79. }
  80.  
  81. public Address2(String name, String date) {
  82. super();
  83. this.name = name;
  84. this.date = date;
  85. }
  86.  
  87. public int getId() {
  88. return id;
  89. }
  90.  
  91. public void setId(int id) {
  92. this.id = id;
  93. }
  94.  
  95. public String getName() {
  96. return name;
  97. }
  98.  
  99. public void setName(String name) {
  100. this.name = name;
  101. }
  102.  
  103. public String getDate() {
  104. return date;
  105. }
  106.  
  107. public void setDate(String date) {
  108. this.date = date;
  109. }
  110.  
  111. @Override
  112. public String toString() {
  113. return "" + this.id + " 名字:" + this.name + " 时间:" + this.date;
  114. }
  115. }
  116.  
  117. /**
  118. *
  119. * @author Test
  120. * @createDate 2014-5-31上午10:21:50
  121. * @className BeanCopierTest.java
  122. * @useFor 用于转换类型 比如 Address1中的Date类型 转成String
  123. */
  124. class DateStringConverter implements Converter {
  125.  
  126. @SuppressWarnings("all")
  127. @Override
  128. /**
  129. * @author Test
  130. * @createDate 2014-5-31
  131. * @params value是Src对象 target是From对象 context是From类中的方法名
  132. * @return void
  133. * @useFor 实现转换方法
  134. */
  135. public Object convert(Object value, Class target, Object context) {
  136. System.out.println(value.getClass() + " " + value); // Src对象
  137. System.out.println(target); // From对象
  138. System.out.println(context.getClass() + " " + context); // String对象,具体的方法名
  139. if (value.getClass().isAssignableFrom(Date.class)) {
  140. return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(value);
  141. } else {
  142. return value;
  143. }
  144. }
  145.  
  146. }

参考:http://blog.csdn.net/shuwei003/article/details/7971685

BeanCopier对象复制学习的更多相关文章

  1. Object 对象方法学习之(1)—— 使用 Object.assign 复制对象、合并对象

    作用 Object.assign() 方法用于把一个或多个源对象的可枚举属性值复制到目标对象中,返回值为目标对象. 语法 Object.assign(target, ...sources) 参数 ta ...

  2. Object.assign(o1, o2, o3) 对象 复制 合拼

    Object 对象方法学习之(1)—— 使用 Object.assign 复制对象.合并对象 合并对象 var o1 = {a: 1}; var o2 = {b: 2}; var o3 = {c: 3 ...

  3. SpringBoot 如何进行对象复制,老鸟们都这么玩的!

    大家好,我是飘渺. 今天带来SpringBoot老鸟系列的第四篇,来聊聊在日常开发中如何优雅的实现对象复制. 首先我们看看为什么需要对象复制? 为什么需要对象复制 如上,是我们平时开发中最常见的三层M ...

  4. PHP基础知识之对象复制

    对象的复制默认为浅复制 进行深复制的方法为:在类中定义魔法方法__clone(),类的对象复制时,会自动调用 __clone方法,在 __clone方法中可以进行各种复制对象的个性化 class My ...

  5. JS对象复制

    在JavaScript很多人复制一个对象的时候都是直接用"=",因为大家都觉得脚本语言是没有指针.引用.地址之类的,所以直接用"="就可以把一个对象复制给另外一 ...

  6. PHP写时复制, 变量复制和对象复制不同!!!

    2016年3月18日 15:09:28 星期五 一直以为PHP对象也是写时复制....... 其实: PHP的变量是写时复制, 对象是引用的 写时复制: $a = $b; 如果$b的内容不改变, $a ...

  7. 【转】JavaScript中的对象复制(Object Clone)

    JavaScript中并没有直接提供对象复制(Object Clone)的方法.因此下面的代码中改变对象b的时候,也就改变了对象a. a = {k1:1, k2:2, k3:3}; b = a; b. ...

  8. 对象复制、克隆、深度clone

    -------------------------------------------------------------------------------- ------------------- ...

  9. PHP5的对象复制

    今天用yii开发程序,一个bug改了一晚上,最后发现问题出在了对象复制机制上,PHP5之前的对象复制只需要$object_a = $object_b即可,但PHP5这样得到的是浅复制,及指针指向,并不 ...

随机推荐

  1. Codeforces 1194E. Count The Rectangles

    传送门 看到 $n<=5000$,直接暴力枚举左右两条竖线 然后考虑怎么计算高度在某个范围内,左端点小于等于某个值,右端点大于等于某个值的横线数量 直接用权值树状数组维护当前高度在某个区间内的横 ...

  2. button标签与input type=button标签使用的差异

    button标签和input type=button标签都是html文档中用来表示按钮属性的元素,不过他们在布局和实际使用功能中存在一些差异. 下面将项目中遇到的一些总结如下: 1.属性和布局差异. ...

  3. maven项目转换为gradle项目

    进入到项目更目录,运行 gradle init --type pom 上面的命令会根据pom文件自动生成gradle项目所需的文件和配置,然后以gradle项目重新导入即可.

  4. JDK8~13新特性概览

    JDK8 1. 接口default 与 static 关键字 /** * jdk8中接口可以使用声明default和static修饰的方法 * static修饰的方法和普通的方法一样,可以被直接调用 ...

  5. U盘重装系统

    一.准备工作 (1)8G以上空间的U盘一个: (2)将U盘制作好启动工具: 1.下载启动工具制作软件(常用的有:大白菜.电脑店.老毛桃.快启动等等一系列软件,直接百度这些软件的名称,或者百度U盘启动制 ...

  6. 富文本编辑器--使用textarea即时更新文本域同步编辑器内容

    使用 textarea wangEditor 从v3版本开始不支持 textarea ,但是可以通过onchange来实现 textarea 中提交富文本内容. <div id="di ...

  7. ubuntu - 如何以root身份使用图形界面管理文件?

    nautilus 是gnome的文件管理器,但是如果不是root账号下,权限受限,我们可以通过以下方式以root权限使用! 一,快捷键“ctrl+alt+t”,调出shell. 二,在shell中输入 ...

  8. Linux上ssh免秘钥互登

    两台机器分别为:master:192.168.1.10sever1:192.168.1.20 1.检查机器名和连通性 a.查看/etc/hostname [root@master master]# m ...

  9. Delphi BitBtn组件

  10. xml配置文件命名空间学习

    xmlns(XML Namespaces的缩写)是一个属性,是XML(标准通用标记语言的子集)命名空间.作用是赋予命名空间一个唯一的名称. 编写Spring或者Maven或者其他需要用到XML文档的程 ...