对象拷贝的陷阱【把人装进了狗笼里】

本文详细解析了在使用commons-beanutils.jar中的BeanUtils.copyProperties进行对象属性复制时,特别是涉及对象深度拷贝时的常见陷阱,并通过具体实例展示了如何正确避免这些陷阱,确保数据完整性和一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[b]当你使用[size=medium][color=red]commons-beanutils.jar[/color][/size]插件的[color=red][size=medium]BeanUtils.copyProperties[/size][/color]对象拷贝功能时,尤其是涉及到对象深度拷贝的时候尽量避免下面例子:
不要把人装进了狗笼里面[/b]
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();
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值