前言
- 最近我一直在尝试手写一个简单的框架,其中,在补全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)
-
这个时候回导入一些东西,之后就可以直接获取参数名了