天天看點

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));
    }
  }
  
}      

執行結果: