通过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)

  • 在这里插入图片描述

  • 这个时候回导入一些东西,之后就可以直接获取参数名了

  • 在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/BeamCSDN/article/details/84497260
今日推荐