有一个问题关于spingmvc获取方法参数的,理论上讲spingmvc可以直接将请求参数注入controller的参数中,说明它可以直接地获得真实的参数名。
正常情况下,反射是获取不到的,主要是编译的时候没有将参数名写入class文件?(因为经过实验使用idea编译的class文件即使有写入参数名,反射还是获取不到,如果在编译的时候没有,加入-parameters,当然这个不太重要)
那问题来了,我在controller里面写一段反射获取参数名,为啥也获取不到参数名呢?spingmvc用了什么技术它就可以获取到?asm吗?
该回答引用NewBing
你好,这是Bing。我可以帮你解答这个问题。😊
根据搜索结果①②③,Spring MVC 可以获取方法参数名的原因是它使用了 ASM 技术来解析字节码,从而得到参数名。ASM 是一个 Java 字节码操作和分析框架,可以直接操作类或者动态生成类。
反射获取不到参数名的原因是 Java 编译器默认不会将参数名写入 class 文件,除非使用 -parameters 或 -g:vars 选项编译。即使使用了这些选项,反射也需要 JDK 8 或以上版本才能支持 Parameter 类来获取参数名。
源: 与必应的对话, 2023/2/28
(1) Spring MVC 获取方法参数的名称_CmdSmith的博客-CSDN博客. https://blog.csdn.net/CmdSmith/article/details/111048259 访问时间 2023/2/28.
(2) Spring MVC 接收请求参数所有方式总结! - 腾讯云开发者社区-腾讯云. https://cloud.tencent.com/developer/article/1646894 访问时间 2023/2/28.
(3) 为何Spring MVC可获取到方法参数名,而MyBatis却不行?【享学Spring MVC】 - YourBatman - 博客园. https://www.cnblogs.com/yourbatman/p/11532689.html 访问时间 2023/2/28.
因为编译之后,参数名就变成arg0了,这个跟反射任何关系的