前言
最近我一直在尝试手写一个简单的框架,其中,在补全mvc框架的时候,遇到了Method方法关于版本以及一些奇奇怪怪的坑。
具体介绍
框架需要实现的部分如下
将到有@requestMapping的注解的方法通过反射机制获取出来
将获取到的Method放入一个Map<String,Object>中,其中key为requestMapping对应的url链接,value为Method
在前端进行链接的请求的时候,将请求解析,分别获取到url以及对应的参数。
通过url从map中获取出对应的方法,调用method.invokle
出现问题
其中在调用method.invoke方法的时候,我需要将参数按照一定的顺序传进去,不然可能会报错
我先将method需要传入的参数全部取出,以及需要传入的参数如下
1 2 3 |
Object [] paramValues= new Object[parameterTypes.length]; Parameter[] parameters = method.getParameters(); |
1 2 3 4 5 6 7 8 |
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; } } |
1 |
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)
- 这个时候回导入一些东西,之后就可以直接获取参数名了
- 转自:https://blog.csdn.net/BeamCSDN/article/details/84497260