通過java反射機制,Method獲取出來的引數名為
阿新 • • 發佈:2018-11-26
記錄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)
-
這個時候回匯入一些東西,之後就可以直接獲取引數名了