浅复制的时候,如果本里面包含了对象这个就会出现问题,bean里面的对bean的引用是地址的引用而非真正实体的引用,
List<Student> list = new ArrayList<>();
list.add(new Student("小哥","女人", "lalalalaalala"));
Student student = new Student("大哥","女人", "null");
Person person = new Person("11","老师","女",student,list);
Person person1 = new Person();
BeanUtils.copyProperties(person,person1);
student.setFactior("地球人");
list.get(0).setGirlFriends("我爱你中国,你会在哪里啊啊,在哪里啊");
System.out.println(person);
System.out.println(person1);
结果如下所示:
Person{id='11', name='老师', sex='女', student=Student{name='大哥', factior='地球人', girlFriends='null'}, list=[Student{name='小哥', factior='女人', girlFriends='我爱你中国,你会在哪里啊啊,在哪里啊'}]}
Person{id='11', name='老师', sex='女', student=Student{name='大哥', factior='地球人', girlFriends='null'}, list=null}
如果你对引用对象的修改,会导致原来bean里面的bean的属性也会被修改的(对象对对象的引用是由对象之家的的地址检进行连接的,正如上面所写对象属性的修改导致整个对象属性之间的修改),对于list集合潜伏着不会将其复制过去,对象之间的clone也属于浅复制的一项。
要实现真正的深复制,我个建议使用二进制流来进行文件流来进行,这样就会将地址重新复制*(将该对象序列化成流,因为写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝)
先将其序列化进行二进制的读取
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(o);
然后反序列化,从流里读取出来,即完成复制
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
outer = (Outer) ois.readObject();