Spring之运行时获取controller参数名称的方法
来源:互联网 发布:软件单元测试报告 rup 编辑:程序博客网 时间:2024/06/08 06:44
先看下面的例子:
package org.reflect;import java.lang.reflect.Method;import java.lang.reflect.Parameter;public class MethodName { public String hello(String hehe,String haha){ return "world"; } public static void main(String[] args) { Class<MethodName> clz = MethodName.class; Method[] methods = clz.getMethods(); for(int i=0;i<methods.length;i++){ Method method = methods[i]; if(method.getName().equals("hello")){ Parameter[] parameters = method.getParameters(); //通过debug看到的名称是arg0和arg1。 } } }}
首先需要清楚的认识到,反射不是万能的,不是任何信息都可以获取到的。在上面的代码中,参数名“hehe”和"haha"就不能简单的通过反射获取到。
(但是不是一定无法通过反射获取到,需要编译设置,请参考:https://docs.oracle.com/javase/tutorial/reflect/member/methodparameterreflection.html)
那么在编译器没有配置的情况下,怎样获取到参数名称呢。
调查时,使用javap命令看到如下信息:
javap -v -l -s -p -c .class文件路径
public java.lang.String hello(java.lang.String, java.lang.String); descriptor: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; flags: ACC_PUBLIC Code: stack=1, locals=3, args_size=3 0: ldc #2 // String world 2: areturn LineNumberTable: line 11: 0 LocalVariableTable: Start Length Slot Name Signature 0 3 0 this Lorg/reflect/MethodName; 0 3 1 hehe Ljava/lang/String; 0 3 2 haha Ljava/lang/String;
注意LocalVariableTable这个属性,这个属性下面包含参数名称hehe和haha。也就是说这给程序运行时提供了获取参数名称的方法,其实spring也是使用这种方法获取到的(可以参考LocalVariableTableParameterNameDiscoverer这个spring类调查)。
但是这个属性也不是运行时获取的,它是通过读取.class文件获取到的属性。即如果给程序传递一个Class变量,如org.MyClass,那么程序就会读取org/MyClass.class这个文件,从文件中取得LocalVariableTable这个属性的信息,进而获取到参数名称。
(注意:.class文件包含的信息量和Class变量包含的信息量是不同的,虽然Class变量是由加载.class文件得到的,但是并不代表JVM一定把.class文件里的信息全部加载到内存中或者运行时中)。
注意:
上面提到的两种方法,包括spring,都不是一定能获取到的,如果获取不到,就需要手动在注解里,如@RequestParam里指定映射参数。
参照ParameterNameDiscoverer的javadoc。
阅读全文
0 0
- Spring之运行时获取controller参数名称的方法
- Spring LocalVariableTableParameterNameDiscoverer 获取方法的参数名称
- Spring Controller 获取请求参数的几种方法
- Spring Controller 获取请求参数的几种方法
- Spring 中 java 获取方法参数名称
- java8获取方法的参数名称
- java获取方法的参数名称
- 菜鸟学习Spring——60s利用JoinPoint获取参数的值和方法名称
- spring aop 利用JoinPoint获取参数的值和方法名称
- Java如何获取方法参数的参数名称?
- MVC View中获取action、controller、area名称、参数
- 菜鸟学习Spring——60s利用JoinPoint(连接点)获取参数的值和方法名称()
- JoinPoint获取参数的方法和名称(1)
- Java获取函数参数名称的几种方法
- Spring 运行时获得配置文件中参数的方法
- SpringMVC的Controller方法参数
- Spring Boot -- Controller之Validate参数校验
- Spring MVC 获取url参数的方法
- 算法时间复杂度和空间复杂度
- RBAC从零开始--登录及登录拦截器
- webSocket初认识和使用
- hive的内置函数
- 【UML 建模】UML入门 之 交互图 -- 时序图 协作图详解
- Spring之运行时获取controller参数名称的方法
- 终端音视频播放处理方案整理
- HTTP的状态码
- mesos+marathon+zookeeper的docker管理集群亲手搭建实例(详细)
- Java中long和Long有什么区别
- Mac 关闭chrome的自动更新解决版本更新造成的自动化测试脚本执行不通过的问题
- SGU
- 产品——小理解,
- Duplicate entry 'XXX' for key 'XXX'