程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 重構—利用反射合並函數

重構—利用反射合並函數

編輯:關於JAVA

先看下重構前的測試用例:

 

public class TestLogin extends TestCase{
  private ButtonManagerIbatis buttonManagerIbatis;
  
   protected void setUp() throws Exception {
      context = getContext();
      buttonManagerIbatis = (ButtonManagerIbatis)context.getBean

("buttonManagerIbatis");
      super.setUp();
    }
    ApplicationContext context ;
    protected ApplicationContext getContext() {  
       String[] paths = {"/context/application_context.xml"};
       ApplicationContext  ctx = new ClassPathXmlApplicationContext(paths);
       return ctx;
    }
  
  /** *//**
   * 測試:登陸後讀取權限信息,並且封裝為樹形結構
   */
   public void testLongin(){
     List<Button> list = buttonManagerIbatis.getAuth("0000");
     testall(list);
     
   }
    Map<String,Model> modelmap = new HashMap<String,Model>();
    Map<String,Menu> fmenumap = new HashMap<String,Menu>();
    Map<String,Menu> smenumap = new HashMap<String,Menu>();
    
    public void testall(List<Button> buttonList){
      for(Button button :buttonList){
        test(modelmap,button);
      }
      for(Model model : modelmap.values()){
        test2(smenumap,model);
      }
      for(Menu menu : smenumap.values()){
        test3(fmenumap,menu);
      }
      for(Menu fmenu :fmenumap.values() ){
        System.out.println(fmenu.getMenuName());
        for(Menu smenu :fmenu.getMenus() ){
          System.out.println(" "+smenu.getMenuName());
          for(Model model : smenu.getModels()){
            System.out.println("  "+model.getName());
            for(Button b:model.getButtons()){
              System.out.println("   "+ b.getButtonDesc());
            }
          }
        }
      }
    }
  
    public void test(Map<String,Model> modelmap , Button b){
      Model m = b.getModel();
      if(!modelmap.containsKey(m.getId()))
        modelmap.put(m.getId(),m);
      modelmap.get(m.getId()).getButtons().add(b);
    }
    
    public void test2(Map<String,Menu> menumap , Model m){
      Menu menu = m.getMenu();
      if(!menumap.containsKey(menu.getId()))
        menumap.put(menu.getId(),menu);
      menumap.get(menu.getId()).getModels().add(m);
        
    }
    
    public void test3(Map<String,Menu> menumap , Menu smenu){
      Menu fmenu = smenu.getMenu();
      if(!menumap.containsKey(fmenu.getId()))
        menumap.put(fmenu.getId(),fmenu);
      menumap.get(fmenu.getId()).getMenus().add(smenu);
    }
    
}

這裡有3個方法 test, test2 ,test3 考慮到以後還可能有變化,所以想把他們合成一個方法,首先考 慮到了反射

 

    public void testC(Map map , Object t , String parent ,String childrenname){
      try {
        Object t_parent = BeanUtils.getDeclaredProperty(t, parent);
        Object t_parent_id = BeanUtils.getDeclaredProperty(t_parent, "id");
        if(!map.containsKey(t_parent_id)){
          map.put(t_parent_id, t_parent);
        }
        Object o = map.get(t_parent_id);
        Collection t_collection =(Collection)BeanUtils.getDeclaredProperty(o, 

childrenname);
        t_collection.add(t);
      } catch (IllegalAccessException e) {
        e.printStackTrace();
      } catch (NoSuchFieldException e) {
        e.printStackTrace();
      }
    }

於是修改後的測試用例為:

 

public class TestLogin extends TestCase{
  private ButtonManagerIbatis buttonManagerIbatis;
  
   protected void setUp() throws Exception {
      context = getContext();
      buttonManagerIbatis = (ButtonManagerIbatis)context.getBean

("buttonManagerIbatis");
      super.setUp();
    }
    ApplicationContext context ;
    protected ApplicationContext getContext() {  
       String[] paths = {"/context/application_context.xml"};
       ApplicationContext  ctx = new ClassPathXmlApplicationContext(paths);
       return ctx;
    }
   public void testLongin(){
     List<Button> list = buttonManagerIbatis.getAuth("0000");
     testall(list);
     
   }
     Map<String,Model> modelmap = new HashMap<String,Model>();
     Map<String,Menu> fmenumap = new HashMap<String,Menu>();
     Map<String,Menu> smenumap = new HashMap<String,Menu>();
    
    public void testall(List<Button> buttonList){
      for(Button button :buttonList){
        testC(modelmap,button,"model","buttons");
      }
      
      for(Model model : modelmap.values()){
        testC(smenumap,model,"menu","models");
      }
      for(Menu menu : smenumap.values()){
        testC(fmenumap,menu,"menu","menus");
      }
      
      for(Menu fmenu :fmenumap.values() ){
        System.out.println(fmenu.getMenuName());
        for(Menu smenu :fmenu.getMenus() ){
          System.out.println(" "+smenu.getMenuName());
          for(Model model : smenu.getModels()){
            System.out.println("  "+model.getName());
            for(Button b:model.getButtons()){
              System.out.println("   "+ b.getButtonDesc());
            }
          }
        }
      }
    }
    /** *//**
     *
     * @param map
     * @param b
     */
    @SuppressWarnings("unchecked")
    public void testC(Map map , Object t , String parent ,String childrenname){
      try {
        Object t_parent = BeanUtils.getDeclaredProperty(t, parent);
        Object t_parent_id = BeanUtils.getDeclaredProperty(t_parent, "id");
        if(!map.containsKey(t_parent_id)){
          map.put(t_parent_id, t_parent);
        }
        Object o = map.get(t_parent_id);
        Collection t_collection =(Collection)BeanUtils.getDeclaredProperty(o, 

childrenname);
        t_collection.add(t);
      } catch (IllegalAccessException e) {
        e.printStackTrace();
      } catch (NoSuchFieldException e) {
        e.printStackTrace();
      }
    }
    
}

例外 BeanUtils中的 反射方法:

 

static public Object getDeclaredProperty(Object object, String propertyName) throws 

IllegalAccessException, NoSuchFieldException {
    Assert.notNull(object);
    Assert.hasText(propertyName);
    Field field = object.getClass().getDeclaredField(propertyName);
    return getDeclaredProperty(object, field);
  }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved