牛骨文教育服务平台(让学习变的简单)
博文笔记

JAVA对象属性复制

创建时间:2012-08-10 投稿人: 浏览次数:9929

编程过程中,有些时候某些不同的类有相同的字段,可能会遇到同时给他们赋值的情况...

简单的时候,可以写重复的代码...重复太多的时候,就不如给一个赋值完,直接复制给另一个对象..


上面这种情况在数据库的实体类中比较常见...


下面是一个简单的对象属性复制方法:

复制的对象必须同时拥有setter和getter方法...只有一个的时候会报异常,都没有的时候就不复制..

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;

public class CopyUtil{
	public static void Copy(Object source, Object dest)throws Exception {
		//获取属性
		BeanInfo sourceBean = Introspector.getBeanInfo(source.getClass(), java.lang.Object.class);
		PropertyDescriptor[] sourceProperty = sourceBean.getPropertyDescriptors();
		
		BeanInfo destBean = Introspector.getBeanInfo(dest.getClass(), java.lang.Object.class);
		PropertyDescriptor[] destProperty = destBean.getPropertyDescriptors();
		
		try{
			for(int i=0;i<sourceProperty.length;i++){
				
				for(int j=0;j<destProperty.length;j++){
					
					if(sourceProperty[i].getName().equals(destProperty[j].getName())){
						//调用source的getter方法和dest的setter方法
						destProperty[j].getWriteMethod().invoke(dest, sourceProperty[i].getReadMethod().invoke(source));
						break;					
					}
				}
			}
		}catch(Exception e){
			throw new Exception("属性复制失败:"+e.getMessage());
		}
	}
}


两个测试的简单类O1,O2

public class O1 {
	private String aac001;
	private String aac002;
	private Double ddd001;
	
	public String getAac001() {
		return aac001;
	}
	public void setAac001(String aac001) {
		this.aac001 = aac001;
	}
	public String getAac002() {
		return aac002;
	}
	public void setAac002(String aac002) {
		this.aac002 = aac002;
	}
	public Double getDdd001() {
		return ddd001;
	}
	public void setDdd001(Double ddd001) {
		this.ddd001 = ddd001;
	}
}

public class O2 {
	/////////////////////////////////////////
	private String aac001;
	private String aac002;
	private Double ddd001;
	/////////////////////////////////////////
	
	private String aac003;
	private String aac004;
	public String getAac002() {
		return aac002;
	}
	public void setAac002(String aac002) {
		this.aac002 = aac002;
	}
	public String getAac001() {
		return aac001;
	}
	public void setAac001(String aac001) {
		this.aac001 = aac001;
	}
	public String getAac003() {
		return aac003;
	}
	public void setAac003(String aac003) {
		this.aac003 = aac003;
	}
	public String getAac004() {
		return aac004;
	}
	public void setAac004(String aac004) {
		this.aac004 = aac004;
	}
	public Double getDdd001() {
		return ddd001;
	}
	public void setDdd001(Double ddd001) {
		this.ddd001 = ddd001;
	}
}


测试类

public class CopyTest {
	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		//创建两个不同的对象,两者部分属性一样
		O1 o1 = new O1();
		O2 o2 = new O2();
		
		o1.setAac001("00007");
		o1.setAac002("国产零零零零七");
		o1.setDdd001(Math.PI);
		
		//复制
		CopyUtil.Copy(o1, o2);
		//循环输出o1,o2所有属性
		System.out.println("-------------o1----------------");
		showObjectPropertyValue(o1);
		System.out.println("-------------o2----------------");
		showObjectPropertyValue(o2);
	}
	/**
	 * 循环显示所有含有getter的属性值
	 * @param o
	 * @throws Exception
	 */
	public static void showObjectPropertyValue(Object o) throws Exception{
		for(PropertyDescriptor property:Introspector.getBeanInfo(o.getClass(), java.lang.Object.class).getPropertyDescriptors()){
			System.out.println(property.getReadMethod().invoke(o));
		}
	}
	
}


执行结果:

-------------o1----------------
00007
国产零零零零七
3.141592653589793
-------------o2----------------
00007
国产零零零零七
null
null
3.141592653589793









声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。