Bean熟悉替换,只替换部分属性,其他属性值不改变

需要加入:asm.jar  cglib-2.1.jar,用来map和bean之间的转换(比spring和反射的效率好,因为加入了缓存)

package com.bean.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import net.sf.cglib.beans.BeanMap; public class CopyBean { /**
* @param args
*/
public static void main(String[] args) { User u1 = new User();
u1.setId(1);
u1.setName("用户1");
u1.setPwd("12333");
u1.setAddress("杭州西湖区");
GirlFriend girl11 = new GirlFriend("范冰冰");
GirlFriend girl12 = new GirlFriend("林心如");
List<GirlFriend> list1 = new ArrayList<GirlFriend>();
list1.add(girl11);
list1.add(girl12);
u1.setGirls(list1); User u2 = new User();
u2.setName("【用户222】");
u2.setAddress("【-甘肃省兰州市-】");
GirlFriend girl21 = new GirlFriend("【赵雅芝】");
GirlFriend girl22 = new GirlFriend("【张柏芝】");
GirlFriend girl32 = new GirlFriend("【汤唯】");
List<GirlFriend> list2 = new ArrayList<GirlFriend>();
list2.add(girl21);
list2.add(girl22);
list2.add(girl32);
u2.setGirls(list2); copyBean(u1, u2);
System.out.println("拷贝后:"+u1);
}
}

拷贝的方法:

/**
* 将对象中需要改变的属性值 拷贝到目标对象中,替换目标对象中的部分属性值
*
* @param fromBean 要改变的对象
* @param targetBean 目标对象
*/
public static void copyBean(Object fromBean, Object targetBean) {
Map<String, Object> fromMap = beanToMap(fromBean);
Map<String, Object> toMap = beanToMap(targetBean);
for (String key : fromMap.keySet()) {
if (fromMap.get(key) == null) {
continue;
}
//将fromMap的值设置到toMap中
toMap.put(key, fromMap.get(key));
}
//转换map为bean
mapToBean(toMap, targetBean);
} /**
* 将对象装换为map
*
* @param bean
* @return
*/
public static Map<String, Object> beanToMap(Object bean) {
Map<String, Object> map = new HashMap<String, Object>();
if (bean != null) {
BeanMap beanMap = BeanMap.create(bean);
for (Object key : beanMap.keySet()) {
map.put(key + "", beanMap.get(key));
}
}
return map;
} /**
* 将map装换为javabean对象
*
* @param map
* @param bean
* @return
*/
public static void mapToBean(Map<String, Object> map, Object bean) {
BeanMap beanMap = BeanMap.create(bean);
beanMap.putAll(map);
}

结果:

from:{id=0, girls=[GirlFriend [name=【赵雅芝】], GirlFriend [name=【张柏芝】], GirlFriend [name=【汤唯】]], pwd=null, address=【-甘肃省兰州市-】, name=【用户222】}

to:{id=1, girls=[GirlFriend [name=范冰冰], GirlFriend [name=林心如]], pwd=12333, address=杭州西湖区, name=用户1}

拷贝后:User [编号=1, 姓名=【用户222】, 密码=12333, 地址=【-甘肃省兰州市-】, 女朋友=[GirlFriend [name=【赵雅芝】], GirlFriend [name=【张柏芝】], GirlFriend [name=【汤唯】]]]

最新文章

  1. 问题解决——MFC resource.h 无法添加、提交到SVN
  2. Yocto开发笔记之《根文件系统裁剪》(QQ交流群:519230208)
  3. 装b指南
  4. 烟大 Contest1024 - 《挑战编程》第一章:入门 Problem G: Check The Check(模拟国际象棋)
  5. mySql 自动备份数据库
  6. 开源而又强大的迷你型web服务器推荐
  7. C# 各种集合
  8. IIC的标准操作函数集(C51)包含C和H文件
  9. 初学grunt压缩
  10. PHP批量更新数据
  11. Nginx(二)
  12. SpringBoot几个重要的事件回调、监听机制
  13. AGC001 E - BBQ Hard 组合数学
  14. Codeforces757E.Bash Plays With Functions(积性函数 DP)
  15. oracle中的decode的使用(转)
  16. Eclipse各个版本及其对应代号、下载地址列表
  17. Python 调用 Redis API
  18. MyEclipse持续性开发教程:用JPA和Spring管理数据(三)
  19. CSS3实现垂直居中的新方法
  20. C# 预定义语言

热门文章

  1. PHP服务器配置环境变量
  2. Java学习笔记,前两章总结
  3. MWeb 2.0 测试版可以下载啦,这次是公开测试,感兴趣的朋友可以试试
  4. OpenCV Haartraining
  5. 彻底弄懂css中单位px和em,rem的区别
  6. 安装Ruby下的compress失败
  7. VB.NET中Form窗体运行时,按ESC退出全屏状态
  8. Repeater的Item项绑定DropDownList
  9. YbSoftwareFactory 代码生成插件【十九】:实体类配合数据库表字段进行属性扩展的小技巧
  10. Python数据结构与算法设计总结篇