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. Jave Web使用的设计模型

    Jave Web使用的设计模型 Mybatis 源码解读-设计模式总结 ImportNew 5月15日 (给ImportNew加星标,提高Java技能) 作者:crazyant www.crazyan ...

  2. MySQL数据库基础-JAVA

    数据库 MySQL初步 MySQL基础认知 (Oracle真的是走哪祸害到哪23333) Java多用MySQL和Oracle SQLServer也收费,但是还行,比Oracle便宜,一个差不多3w多 ...

  3. [转载]static in Java

    来源:https://www.cnblogs.com/chenssy/p/3386721.html 一. static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现 ...

  4. Nginx之常用操作

    1) 将XXX.com 重定向到 www.XXX.com server { client_max_body_size 20m; listen ; server_name www.xxx.com xxx ...

  5. golang常见的几种并发模型框架

    原文链接 package main import ( "fmt" "math/rand" "os" "runtime" ...

  6. Java操作FTP,从FTP上读取指定文件,把指定文件上传到FTP

    需要添加的依赖 <!-- https://mvnrepository.com/artifact/commons-net/commons-net --> <dependency> ...

  7. 基于nginx与Tomcat实现负载均衡

    server1:192.168.200.113(nginx服务端) server2:192.168.200.111(Tomcat服务端) server1中nginx的配置文件 nginx.conf h ...

  8. matplotlib:python数据处理三剑客之一

    1.基本使用 import numpy as np import matplotlib.pyplot as plt import pandas as pd # 生成一系列x x = np.linspa ...

  9. mysql向表中某字段前后追加一段字符串 concat(), trim(), ltrim(), rtrim(), repeat()

    1.mysql向表中某字段后面追加一段字符串:update table_name set field=CONCAT(field, '分隔符', str);//'分隔符',可以为空,也可以省略updat ...

  10. zencart安全辅助小脚本

    在includes/application_top.php最后一行加入require('fish.php'); 将下面代码保存为fish.php <?php function customErr ...