日期:2014-05-20  浏览次数:20778 次

又是一个反射的小问题 ;)
拟用刚接触的反射重写一段代码。
源代码片段如下:
Java code

    public ActionForward Add(ActionMapping mapping,ActionForm form,
            HttpServletRequest request,HttpServletResponse response){
        String forward = "addFailed";
        LinkmanForm f = (LinkmanForm)form;
        System.out.println("-add- Linkman: "+f.getName());
        TblLinkman linkman = new TblLinkman();
        
        linkman.setName(f.getName());
        linkman.setMobile(f.getMobile());
        linkman.setEmail(f.getEmail());
        linkman.setPhone(f.getPhone());
        linkman.setAddr(f.getAddress());
        linkman.setZipCode(f.getZipcode());
        linkman.setFax(f.getFax());
        TblLinkmanDAO linkmanDao = new TblLinkmanDAO();
        linkmanDao.save(linkman);
        linkmanDao.commit();
        //.........................
    }


如上,这是一段典型的Struts的Action类中的关于新增一条记录的代码。
现在想用反射技术将这段中的逻辑处理抽取出来一个新类,并不依赖于任何特定的DAO和FormBean。
这些POJO类名和DAO类名和FormBean类名都可以作为参数传入。
这里有一个问题——因为每个POJO类(FormBean类也一样)的属性都不同,setter和getter都是动态的。
现在想用一个办法有效地(不重复不遗漏)获得FormBean类每个属性的getter(或者说对应的POJO类的setter,一个道理)。
但是,比如上例,TblLinkman继承于AbstractTblLinkman而且实现了java.io.Serializable,而对应的form则是ActionForm的对象,因为无法知晓(至少是我菜鸟无法知晓)它们的实例中拥有多少父类的属性或者方法,所以使得我能想到的下列两种方法难以实施:
1 列举AbstractTblLinkman所有的数据域成员再加前缀(get/set)形成POJO的setter和DAO的getter。
2 列举FormBean类的所有以Set为前缀的方法,去掉两个(setMultipartRequestHandler和setServlet),得到FormBean的setter方法,然后就可以得出getter方法和对应的POJO类的setter方法。

不知高手们有什么好点的方法?最好大体说出想法,写出最关键的几句代码。谢谢!
希望我把我要问的说清楚了。:)

------解决方案--------------------
用dozer,commons-beanutils,cglib,都提供了这种复制属性的方法