1.当把对象放到map中以后,修改对象内容,一样会影响对象的属性的值

import java.util.HashMap;
import java.util.Map;public class TTTT {public static void main(String[] args) {Person p1 = new Person("zhangsan", 10);Map<String, Person> map = new HashMap<String, Person>();map.put("test", p1);p1.setName("lisi");p1.setAge(11);System.out.println(map.get("test"));}}class Person{private String name;private int age;public Person(){}public Person(String name, int age){this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String toString(){return name + ":" + age;}
}

输出结果:

lisi:11

这个结果是因为map中和p1始终指向同一个对象,所以修改值以后会互相影响

为了处理这种互相影响的情况,在从map或者对象后,我们通常不直接处理对象,而是通过net.sf.cglib.beans.BeanCopier复制一个对象以后再进行操作,以免影响了map的对象原型。

import java.util.HashMap;
import java.util.Map;import net.sf.cglib.beans.BeanCopier;public class TTTT {public static void main(String[] args) {Person p1 = new Person("zhangsan", 10);Map<String, Person> map = new HashMap<String, Person>();map.put("test", p1);p1.setName("lisi");p1.setAge(11);BeanCopier copier = BeanCopier.create(Person.class, Person.class, false);Person p2 = new Person();copier.copy(p1, p2, null);System.out.println(p2);p2.setName("p2's name");p2.setAge(200);System.out.println(p2);System.out.println(map.get("test"));}}class Person{private String name;private int age;public Person(){}public Person(String name, int age){this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String toString(){return name + ":" + age;}
}

上面的代码通过拷贝,实现了修改p2而不影响,map中的对象,其实复制对象还有其他很多方法,比如自己手动set,比较麻烦、使用PropertyUtils或者使用BeanUtils。

从网上查的资料显示:

  1. BeanCopier的性能是PropertyUtils (apache-common)的504倍。
  2. PropertyUtils的性能是BeanUtils(apache-common)的1.71倍

可见,对于对象的拷贝,应尽量使用cglib的BeanCopier.

注意:BeanCopier在get方法和set方法不严格匹配的时候会出问题.

import java.util.HashMap;
import java.util.Map;import net.sf.cglib.beans.BeanCopier;public class TTTT {public static void main(String[] args) {Person p1 = new Person("zhangsan", 10);BeanCopier copier = BeanCopier.create(Person.class, Person.class, false);Person p2 = new Person();copier.copy(p1, p2, null);System.out.println("p1:" + p1);System.out.println("p2:" + p2);}}class Person{private String name;private int age;public Person(){}public Person(String name, int age){this.name = name;}public int getAge() {return age + 1;}public void setAge(int age) {this.age = age;}public String getName() {return name + "T";}public void setName(String name) {this.name = name;}public String toString(){return name + ":" + age;}
}

输出结果:

p1:zhangsan:0
p2:zhangsanT:1

可见,BeanCopier在复制的时候使用get和set方法了。如果get方法不严格,会造成复制的对象属性值不正确。

net.sf.cglib.beans.BeanCopier用途相关推荐

  1. 链式写法下,net.sf.cglib.beans.BeanCopier.copy NullPointerException的问题

    前言 由于MVC分层设计的理念,Java后端开发中,会经常面临各种DTO.DO.PO.VO的对象之间的转换.其中,pojo对象大部分字段名与字段类型一致,为了提供开发效率,避免过多收到set,一般开发 ...

  2. 使用Cglib的BeanCopier实现Bean的拷贝

    选择Cglib的BeanCopier进行Bean拷贝的理由是,其性能要比Spring的BeanUtils,Apache的BeanUtils和PropertyUtils要好很多,尤其是数据量比较大的情况 ...

  3. cglib 的BeanCopier高性能解密

    在一些系统代码中,随处可见的BeanCopier(源于org.springframework.cglib.beans),它主要用在将PO与DTO互转.一些人在惊叹它的高性能的同时,不曾了解它的实现原理 ...

  4. CGLIB中BeanCopier源码实现

    转载:CGLIB中BeanCopier源码实现 文章目录 CGLIB代码包结构 1.core 2.beans 3.reflect 4.proxy BeanCopier实现机制 1.BeanCopier ...

  5. Exception in thread main java.lang.IncompatibleClassChangeError: net/sf/cglib/core/DebuggingClassW

    问题: 今天在运行程序的时候报如下错误. 1. java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor 2. Exception i ...

  6. CGLI 报错 :VerifyError: class net.sf.cglib.core.DebuggingClassWriter overrides final method visit

    1.美图 2.背景 执行案例的测试类报错如下 java.lang.VerifyError: class net.sf.cglib.core.DebuggingClassWriter overrides ...

  7. 异常:Class net.sf.cglib.core.DebuggingClassWriter overrides final method visit

    异常: java.lang.VerifyError: class net.sf.cglib.core.DebuggingClassWriter overrides final method visit ...

  8. com.springsource.net.sf.cglib.jar的下载

    https://mvnrepository.com/artifact/net.sourceforge.cglib/com.springsource.net.sf.cglib/2.2.0

  9. 80 关于 VerifyError net.sf.cglib.core.DebuggingClassWriter overrides final method visit

    前言 呵呵 最近碰到一些 老项目, 使用的传统的 libs 文件夹管理依赖, 显然存在的问题就是 jar 的依赖的问题 然后 之前呢, 也碰到了一些 依赖的相关问题 1. 异常:Class net.s ...

最新文章

  1. 使用LINQ进行多表操作(二)
  2. python安装pip_Python的pip安装总是失败怎么办?
  3. python 函数调用 不允许关键字参数_你所不知道的Python|函数参数的演进之路
  4. .so 依赖目录 cmake_CMake 的研究与学习笔记
  5. Python爬虫开发:requests库的使用--发送带参数post请求
  6. 【Python】正则表达式使用、常用匹配表达式
  7. OpenGL ES入门
  8. AliOS Things网络适配框架 - SAL
  9. 理解Dubbo的调用流程与Dubbo多协议解析
  10. MySQL:常用备份方式(基于5.7)
  11. java day48【 Maven 介绍 、 Maven 的使用 、Maven 常用命令 、 maven 工程运行调试 、总结】...
  12. Day004 20210209-20210217
  13. 软件测试学习之悟空CRM项目测试用例编写
  14. 最详细最直观的>>>理解Pandas分组聚合和透视图标
  15. 我们不需要没脑子的善良
  16. 解决联想拯救者显卡花屏
  17. iOS 对接TopOn聚合广告心得
  18. 【debug】汇编跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等
  19. Linux永久修改主机名
  20. froala WYSIWYG Editor 利用代码实现在线破解,去掉授权提示,去掉保存代码有版权超链接

热门文章

  1. Unity转微信小游戏与JS交互
  2. Html5小游戏 转微信小程序,白鹭H5游戏转微信小游戏问题集锦,你关心的都在这里...
  3. SVLAN,CVLAN,PVLAN是属于SVLAN(Stack VLAN)的观念
  4. error lnk1123:转换到coff期间失败
  5. SSDP 简单服务发现协议
  6. 移动电信数据仓库设计六环节
  7. 机器学习中的概念---输入空间、标记空间、样本空间、假设空间、版本空间
  8. 微信小程序 如何获取时间
  9. 安装和配置Apache + mongrel cluster
  10. NDCG评价指标讲解