主要问题描述:两个对象分别由同一个对象copy过来,对象中有一个成员变量是Map,用该map的时候是同一个引用对象。
BeanUtils类全路径为org.springframework.beans.BeanUtils
类大致如下:
@Data
class A {
private Integer id;
private Map<Integer,String> map = new HashMap<>();
}
问题代码
A source = new A();
source.setId(1);
A copy1 = new A();
BeanUtils.copyProperties(source, copy1);
A copy2 = new A();
BeanUtils.copyProperties(source, copy2);
copy1.getMap().put(1,"1");
copy2.getMap().put(1,"2");
System.out.println(copy1.getMap().get(1));
//以为是"1",实际是"2"
System.out.println(copy2.getMap().get(1));
//"2"
System.out.println(copy1.getMap() == copy2.getMap());
//true,直接对比引用
原因分析,BeanUtils.copyProperties利用反射,直接将对象的引用set进去,并不是深拷贝。
网友评论