使用springframework的BeanUtils.copyProperties的坑
在写代码过程中,在do、dto、vo转换时,经常会用到BeanUtils.copyProperties方法。然后遇到一个有意思的事情,用一个简单的demo说明:
@Data
public class Student {
private String name;
private String age;
private List<Grade> gradeList;
@Data
public static class Grade{
private String count;
}
}
@Data
public class ClassMate {
private String name;
private String age;
private List<Grade1> gradeList;
@Data
public static class Grade1{
private String count;
private Integer ssss;
}
}
这是有相同属性的两个类
然后:
@Test
public void aaa(){
Student student = new Student();
ClassMate classMate = new ClassMate();
classMate.setAge("11");
classMate.setName("xiaozhang");
ClassMate.Grade1 grade = new ClassMate.Grade1();
grade.setCount("11");
grade.setSsss(11);
classMate.setGradeList(new ArrayList<>());
classMate.getGradeList().add(grade);
BeanUtils.copyProperties(classMate,student);
System.out.println(student);
}
}
结果是什么 ?
然后结果是把子类的内部类打印出来
我就想搜一下 深拷贝浅拷贝的问题 结果:
这是搜索结果的前两名 然后点进去 一模一样的内容 :
我看到这个结果我想说 浅拷贝个**
到底是深拷贝还是浅拷贝
还是自己测试一下
@Test
public void aaa(){
Student student = new Student();
ClassMate classMate = new ClassMate();
classMate.setAge("11");
classMate.setName("xiaozhang");
ClassMate.Grade1 grade = new ClassMate.Grade1();
grade.setCount("11");
grade.setSsss(11);
classMate.setGradeList(new ArrayList<>());
classMate.getGradeList().add(grade);
BeanUtils.copyProperties(classMate,student);
classMate.setName("xiaowang");
classMate.getGradeList().get(0).setSsss(22);
System.out.println(student);
System.out.println(student.getName().hashCode());
System.out.println(classMate.getName().hashCode());
System.out.println(classMate.getGradeList().hashCode());
System.out.println(student.getGradeList().hashCode());
}
结果:
是深拷贝吗还是浅拷贝 ,自己理解到底是什么。
同时发现会发生范型覆盖的问题
看了一下 里面的源码
简单来说就是 用反射 取出所有src中的get方法 然后获取值
然后 再用反射 target中的set方法设置值(自己理解)
只要类中的属性的类型 和 属性名称一样 就会设置进去
再深入就看不懂了。
所以,会发生范型覆盖的问题,当有内部类或者引用类型的属性时建议 取出来copy 或者干脆不用BeanUtils.copyProperties。