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. 引入DDT

    一.大致介绍: DDT-Data Driven Test 是Python的第三方库,提供了创建数据驱动的测试,在线安装为:pip install ddt @data 表示元祖的列表数据 @unpack ...

  2. golang 多线程查找文件内容

    package main import ( "fmt" "io/ioutil" "os" "path/filepath" ...

  3. 学习笔记--APIO 2018 二分专题 By wuvin

    前言: 在APIO 2018 Day2下午听wuvin讲二分,听了一上午的神仙,现在终于有可以听懂了. 专题: 平均边权最大 题目链接:https://www.questoj.cn/problem/3 ...

  4. RSA 加密长度计算公式

    The length of data that can be encrypted using RSA is determined primarily by the size of the key yo ...

  5. [转载] Java注解

    目录 元注解 @Retention @Documented @Target @Inherited @Repeatable 注解语法 ---------------------------------- ...

  6. console的各种用法

    console的各种用法 1.输出信息 console.log('消息内容!'); //输出普通信息 console.info('消息内容!'); //输出提示信息 (在ie上有区分) console ...

  7. 多线程编程-- part 7 CountDownLatch

    CountDownLatch简介 CountDownLatch是通过“共享锁”实现的.在创建CountDownLatch中时,会传递一个int类型参数count,该参数是“锁计数器”的初始状态,表示该 ...

  8. 免费使用Google

    这里需要借助一下`梯子`,这里有教程 点击进入 如果没有谷歌浏览器,进入下载最新版谷歌浏览器,进入下载,不要移动它的安装位置,选择默认位置, 如果已经安装了谷歌浏览器,打开赛风之后,选择设置 进行安装 ...

  9. signal,blinker:信号(看我脸色行事)

    signal 什么是信号(signal)? 信号在linux中被用来进行进程间的通信和异步处理,简单地可以理解会为回调函数,当发送一个信号时,会触发相应的操作.python中的signal模块便是用来 ...

  10. golang 结构体嵌入和匿名成员

    考虑一个二维的绘图程序,提供了一个各种图形的库,例如矩形.椭圆形.星形和轮形等几 何形状.这里是其中两个的定义 type Circle struct { X, Y, Radius int } type ...