java的method反射機制(二)

來源:互聯網
上載者:User

在java web 開發中,我們經常會遇到,從後台擷取前台的值,將擷取的值通過set方法賦值給實體,然後將實體存入資料庫中,有時候對於實體屬性多時,代碼量很大(其實都是那些set方法),所以針對這點,我們可以通過method反射機制,寫個通用的底層方法(對任何實體都有效),這樣一來,我們就不用再去一個一個set到實體中去。

public static  Object ObjectMethod(Object obj,HttpServletRequest request){
   Field[] fields = obj.getClass().getDeclaredFields();
   for(Field field:fields){
    String md = "set"+StringUtils.capitalize(field.getName());
    try {
    Method method = obj.getClass().getDeclaredMethod(md, field.getType());
    if("java.lang.String".equals(field.getType().getName())){
     String value = request.getParameter(field.getName());
     method.invoke(obj, value);
    }else if("java.lang.Integer".equals(field.getType().getName())){
     if(!"".equals(request.getParameter(field.getName()))&&request.getParameter(field.getName())!=null){
      Integer value = Integer.valueOf(request.getParameter(field.getName()));
      method.invoke(obj, value);
     }
    }else{//這裡判斷當實體中某個屬性為物件類型時,再一次去反射
     Class c = Class.forName(field.getType().getName());//擷取屬性所對應的實體類
     Object o =c.newInstance();                         //new一個實體類
     Field[] fs = o.getClass().getDeclaredFields();
     for(Field f : fs){
      if(f.getName().endsWith("id")){//需要命名規範
       String set = "set"+StringUtils.capitalize(f.getName());
       Method m = o.getClass().getDeclaredMethod(set, f.getType());
       if("java.lang.Integer".equals(f.getType().getName())){
        Integer value = Integer.valueOf(request.getParameter(field.getName()));
        m.invoke(o, value);
        method.invoke(obj, o);
       }else if("java.lang.String".equals(field.getType().getName())){
        String value = request.getParameter(field.getName());
        m.invoke(o, value);
        method.invoke(obj, o);
       }//今後添加基礎類型
      }
     }
    }
   } catch (SecurityException e) {
    e.printStackTrace();
   } catch (NoSuchMethodException e) {
    e.printStackTrace();
   } catch (InvocationTargetException e) {
    e.printStackTrace();
   }catch (IllegalArgumentException e) {
    e.printStackTrace();
   } catch (IllegalAccessException e) {
    e.printStackTrace();
   } catch (ClassNotFoundException e) {
    e.printStackTrace();
   }catch (InstantiationException e) {
    e.printStackTrace();
   }
   }
   return obj;
  }

 

以上兩篇文章,是對java Method反射機制的一個認識,其實,我們在java web開發中,所用到的架構,hibernate,spring等,都是通過java method反射機制去寫的,由於時間問題,我在這裡就不準備用java method的反射機制去類比 hibernate ,spring架構了,大家有興趣的可以去自己研究,如果有什麼問題,歡迎大家留言!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.