J2EE綜合:如何實現javabean的屬性拷貝

發表于:2008-07-09來源:作者:點擊數: 標簽:數據庫javabean拷貝getjavaBean
在struts的實踐過程中,經常兩個 java bean交換數據的情況,如ActionForm與 數據庫 中的表相關的bean交換數據。通常情況下要寫很多get和set語句,一個個屬性依次拷貝。這樣的話,如此重復繁重的工作讓 程序員 感覺不到編程的快樂。于是在網上查相關資料知,在a
在struts的實踐過程中,經常兩個javabean交換數據的情況,如ActionForm與數據庫中的表相關的bean交換數據。通常情況下要寫很多get和set語句,一個個屬性依次拷貝。這樣的話,如此重復繁重的工作讓程序員感覺不到編程的快樂。于是在網上查相關資料知,在apache.org有一個project:common-beanutil,提供的一個BeanUtil類,這個類有一個靜態方法BeanUtil.copyProperties()實現了該功能。后來我在與java相關的書上知道的java的反射機制(reflect),償試著并實現了兩個javabean的屬性拷貝功能。
import java.lang.reflect.*;
/**
@author Xiaobo Zheng
@date 2005-12-28
*/
public class BeanUtil2{
       /**
       @parameter Object obj1,Object obj2
       @return Object
       用到反射機制
       此方法將調用obj1的getter方法,將得到的值作為相應的參數傳給obj2的setter方法
       注意,obj1的getter方法和obj2方法必須是public類型
       */
       public static Object CopyBeanToBean(Object obj1,Object obj2) throws Exception{
              Method[] method1=obj1.getClass().getMethods();
              Method[] method2=obj2.getClass().getMethods();
              String methodName1;
              String methodFix1;
              String methodName2;
              String methodFix2;
              for(int i=0;i                     methodName1=method1[i].getName();
                     methodFix1=methodName1.substring(3,methodName1.length());
                     if(methodName1.startsWith("get")){
                            for(int j=0;j                                   methodName2=method2[j].getName();
                                   methodFix2=methodName2.substring(3,methodName2.length());
                                   if(methodName2.startsWith("set")){
                                          if(methodFix2.equals(methodFix1)){
                                                 Object[] objs1=new Object[0];
                                                 Object[] objs2=new Object[1];
                                                 objs2[0]=method1[i].invoke(obj1,objs1);//激活obj1的相應的get的方法,objs1數組存放調用該方法的參數,此例中沒有參數,該數組的長度為0
                                                 method2[j].invoke(obj2,objs2);//激活obj2的相應的set的方法,objs2數組存放調用該方法的參數
                                                 continue;                                   
                                          }
                                   }
                            }
                     }
              }
              return obj2;
       }
}
再建一個javabean,并測試
import java.lang.reflect.*;
public class User {
    private String name;
    private String id; 
    public void setName(String name){
        this.name=name;
    }
    public String getName(){
        return this.name;
    }
    public void setId(String id){
        this.id=id;
    }
    public String getId(){
        return this.id;
    }
    public static void main(String[] args) throws Exception{
        User u1=new User();
        u1.setName("zxb");
        u1.setId("3286");
        User u2=new User();
        u2=(User)BeanUtil2.CopyBeanToBean(u1,u2);
        System.out.println(u2.getName());
        System.out.println(u2.getId());          
    }
}
編譯后并執行輸出結果
zxb
3286
成功!

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97