对象拷贝的圈套【把人装进了狗笼里】
对象拷贝的陷阱【把人装进了狗笼里】
当你使用commons-beanutils.jar插件的BeanUtils.copyProperties对象拷贝功能时,尤其是涉及到对象深度拷贝的时候尽量避免下面例子:
不要把人装进了狗笼里面
List<Dog>本来只能添加Dog 但是却从里面取出一个Person
最近也在用,使用beanutils怎么进行深度克隆呢
当你使用commons-beanutils.jar插件的BeanUtils.copyProperties对象拷贝功能时,尤其是涉及到对象深度拷贝的时候尽量避免下面例子:
不要把人装进了狗笼里面
List<Dog>本来只能添加Dog 但是却从里面取出一个Person
import java.util.List; public class Dogs { private String id; private List<Dog> data; public List<Dog> getData() { return data; } public void setData(List<Dog> data) { this.data = data; } public String getId() { return id; } public void setId(String id) { this.id = id; } }
import java.util.List; public class Persons { private String id; private List<Person> data; public List<Person> getData() { return data; } public void setData(List<Person> data) { this.data = data; } public String getId() { return id; } public void setId(String id) { this.id = id; } }
import java.util.Date; public class Person { private String name; private Date dateAttr; public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getDateAttr() { return dateAttr; } public void setDateAttr(Date dateAttr) { this.dateAttr = dateAttr; } }
import java.util.Date; public class Dog { private String name; private Date dateAttr; public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getDateAttr() { return dateAttr; } public void setDateAttr(Date dateAttr) { this.dateAttr = dateAttr; } }
import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.commons.beanutils.BeanUtils; import com.coderside.fragment.json.Dog; import com.coderside.fragment.json.Persons; import com.coderside.fragment.json.Dogs; import com.coderside.fragment.json.Person; public class Test { public static void main(String[] args) { //构造一个Persons对象 Persons persons = new Persons(); persons.setId("1"); Person p = new Person(); p.setDateAttr(new Date()); p.setName("dog"); List<Person> list = new ArrayList<Person>(); list.add(p); persons.setData(list); //构造一个Dogs对象 Dogs dogs = new Dogs(); try { BeanUtils.copyProperties(dogs, persons); for (int i = 0; i < dogs.getData().size(); i++) { //打印出来的是一个人com.coderside.fragment.json.Person对象 System.out.println(dogs.getData().get(i)); // 下面这句看起来是正常的 运行就会抛异常 // Dog dog = dogs.getData().get(i); } } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }
1 楼
xuranpaoche
2012-06-05