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

时间:2023-03-08 18:53:42

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=【汤唯】]]]