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. js中onchange()的使用,实现功能,选择哪一张图片,显示哪一张

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. ITCAST-C# 委托

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _12委 ...

  3. Design Support库中的控件

    1.NavigationView滑动菜单 2.FloatIngActionButton悬浮按钮 3.Snackbar二次交互提示的按钮 4.Coordinatorlayout,监听子控件的各种事件(加 ...

  4. Python 第一个程序

    第一个程序 打开pycharm,新建一个工程,新建一个文件(后缀为.py) 书写最简单的代码:print(人生苦短,我用python!) 执行python代码 使用pycharm的运行按钮 终端下输入 ...

  5. Mybatis常见面试题总结

    1.#{}和${}的区别是什么? ${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc. ...

  6. python3 调用zabbix API实现批量增加删除主机,主机各种监控项------实战

    在以前的博客中谈到了利用zabbix接口来对主机进行批量的增删改查 这里在不用环境中实战遇到了不同问题,这里记录下来以便后续review 以下为实战中获取token的代码,在zabbix标准接口文档中 ...

  7. ab测试工具的使用

    下载地址:http://httpd.apache.org/download.cgi#apache24 编译安装后在安装目录bin下可以找到ab执行程序 基本用法: ab -n 5000 -c 1000 ...

  8. optparse:让你轻松地与命令行打交道

    介绍 一个专门用于命令行参数解析的模块 使用 import optparse op = optparse.OptionParser() # 添加选项 op.add_option("--s&q ...

  9. kubesphere集群节点扩容

    原有的节点是 : master[123] , node[1234] 新加的节点node5 一.修改配置文件hosts.ini [root@master0 ~]# /conf/hosts.ini [al ...

  10. win10 安装ubuntu16.04双系统

    安装了两天的ubuntu系统,很是头疼,发现网上的内容,比较繁杂,因此,写此博客,进行综合整理,总结了安装方法.方便大家安装,减少搜索. 电脑是老师的电脑,配置为: 主板:微星 CPU:英特尔i5 7 ...