`
goodscript
  • 浏览: 72921 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

阅读更多
当你使用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
2
分享到:
评论
2 楼 bushuai19951203 2016-06-06  
你好,我现在的场景是,调用Person人的get方法时出现异常,有什么办法可以解决,但是值是克隆过去了
1 楼 xuranpaoche 2012-06-05  
最近也在用,使用beanutils怎么进行深度克隆呢

相关推荐

Global site tag (gtag.js) - Google Analytics