1. 程式人生 > >通過java反射機制,Method獲取出來的引數名為

通過java反射機制,Method獲取出來的引數名為

記錄2018年我遇見的一個大坑!!!!!

前言

  • 最近我一直在嘗試手寫一個簡單的框架,其中,在補全mvc框架的時候,遇到了Method方法關於版本以及一些奇奇怪怪的坑。

具體介紹

  • 框架需要實現的部分如下
  • 將到有@requestMapping的註解的方法通過反射機制獲取出來
  • 將獲取到的Method放入一個Map<String,Object>中,其中key為requestMapping對應的url連結,value為Method
  • 在前端進行連結的請求的時候,將請求解析,分別獲取到url以及對應的引數。
  • 通過url從map中獲取出對應的方法,呼叫method.invokle

出現問題

  • 其中在呼叫method.invoke方法的時候,我需要將引數按照一定的順序傳進去,不然可能會報錯
  • 我先將method需要傳入的引數全部取出,以及需要傳入的引數如下
 Object [] paramValues= new Object[parameterTypes.length]; 

 Parameter[] parameters = method.getParameters();
 for(Map.Entry<String, String[]> entry : parameterMap.entrySet()){
            	 System.out.println("i parameters[i].getName() entry.getKey() :" + i + " " + parameters[i].getName() + " " + entry.getKey());
            	 if(parameters[i].getName().equals(entry.getKey())){
            		 String value =Arrays.toString(entry.getValue()).replaceAll("\\[|\\]", "").replaceAll(",\\s", ",");
            		 paramValues[i] = value;
            	 }
            		 
             }
Object object = method.invoke(this.controllerMap.get(url), paramValues);
  • 將前端獲取的引數與method獲取的出來的引數通過引數名一一對應,再將值賦予paramValues陣列,但是一直沒辦法對應,因為從method獲取出來的引數陣列的各個元素通過getName()拿到的引數名都是arg開頭的,如arg0,arg1.

解決

  • 經過一大堆的折騰後,發現反射機制獲取引數名是jdk8之後才實現的,但是自己已經通過pom設定好了jdk版本了,後來再查資料,發現還需要開啟必須手動在編譯時開啟-parameters 引數。以idea和myeclise2015為例(其中idea是網上找到的,以這個為參考,我對應開啟我的ME2015的)

  • idea 你需要在Preferences->Build,Execution,Deployment->Compiler->java Compiler 頁面新增該編譯選項

  • 在這裡插入圖片描述

  • myeclise2015

  • window 》 prefenrences 》 java 》Compiler 》 點選 strore infomation about method parameters(usable via reflection)

  • 在這裡插入圖片描述

  • 這個時候回匯入一些東西,之後就可以直接獲取引數名了

  • 在這裡插入圖片描述