龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

J2EE综合:如何实现javabean的属性拷贝

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
在struts的实践过程中,经常两个javabean交换数据的情况,如ActionForm与数据库中的表相关的bean交换数据。通常情况下要写很多get和set语句,一个个属性依次拷贝。这样的话,如此重复繁重的
在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
  成功!
精彩图集

赞助商链接