JAVA对象属性复制

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

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


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


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

复制的对象必须同时拥有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









评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

isea533

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值