编程过程中,有些时候某些不同的类有相同的字段,可能会遇到同时给他们赋值的情况...
简单的时候,可以写重复的代码...重复太多的时候,就不如给一个赋值完,直接复制给另一个对象..
上面这种情况在数据库的实体类中比较常见...
下面是一个简单的对象属性复制方法:
复制的对象必须同时拥有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