标签:name 表示 解决办法 com exp false string beanutils 反射机制
1 User uuu = new User(); 2 uuu.setId("888"); 3 User u2 = new User(); 4 u2 = uuu; 5 u2.setName("222"); 6 User u3 = new User(); 7 u3 = uuu; 8 u3.setName("333"); 9 System.out.println(uuu+"---"+u2+"---"+u3);
输出结果:
com.hmbb.demo.entity.User@34136bd1---com.hmbb.demo.entity.User@34136bd1---com.hmbb.demo.entity.User@34136bd1
其实这样并没有创建3个对象,而是同一个对象;“=” 表示使对象引用 u2,u3 指向刚创建的 User 对象 uuu。一个对象引用可以指向0个或者1个对象;一个对象可以有N个引用指向它。(个人理解:一个人可以不住房子,或者同时只能住在一栋房子,一栋房子可以住多个人;且人可以改变房子的属性)
解决办法:
利用反射机制对JavaBean的属性进行处理
1 User uuu = new User(); 2 uuu.setId("888"); 3 User u2 = new User(); 4 BeanUtils.copyProperties(uuu,u2); 5 u2.setName("222"); 6 User u3 = new User(); 7 BeanUtils.copyProperties(uuu,u3); 8 u3.setName("333"); 9 System.out.println(uuu+"---"+u2+"---"+u3);
输出结果:
com.hmbb.demo.entity.User@28ee0a3c---com.hmbb.demo.entity.User@2dd1086---com.hmbb.demo.entity.User@6b8d54da
但是,当需要拷贝的对象数量多的时候,BeanUtils.copyProperties 性能很差。对性能要求高的时候就直接手动 get,set。
BeanUtils 有两个包,一个是 apache,一个是
spring,他们使用时参数位置刚好相反,spring 是从左复制到右,且 apache.BeanUtils 会比 spring.BeanUtils
更慢。还可以用 BeanCopier > org.springframework.cglib.beans ;这个相对前两个会快一点,但是频繁 create也是会占用服务器资源,有利有弊。
1 User uuu = new User(); 2 uuu.setId("888"); 3 User u2 = new User(); 4 BeanCopier beanCopier = BeanCopier.create(uuu.getClass(),u2.getClass(),false); 5 beanCopier.copy(uuu,u2,null);
当复制 Map 对象时,一样不能用“=”,可以用 putAll 方法:
1 Map<String,Object> map0 = new HashMap<>(); 2 map0.put("id",1); 3 Map<String,Object> map1 = new HashMap<>(); 4 map1.putAll(map0); 5 map1.put("name",11); 6 Map<String,Object> map2 = new HashMap<>(); 7 map2.putAll(map0); 8 map2.put("name",22); 9 System.out.println(map0+"---"+map1+"---"+map2);
输出结果:
{id=1}---{name=11, id=1}---{name=22, id=1}
标签:name 表示 解决办法 com exp false string beanutils 反射机制
原文地址:https://www.cnblogs.com/hellohmbb/p/14199963.html