程式設計過程中,有些時候某些不同的類有相同的字段,可能會遇到同時給他們指派的情況...
簡單的時候,可以寫重複的代碼...重複太多的時候,就不如給一個指派完,直接複制給另一個對象..
上面這種情況在資料庫的實體類中比較常見...
下面是一個簡單的對象屬性複制方法:
複制的對象必須同時擁有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));
}
}
}
執行結果: