(因为经过实验使用idea编译的class文件即使有写入参数名,反射还是获取不到,加入-parameters,我在controller里面写一段反射获取参数名,为啥也获取不到参数名呢

有一个问题关于spingmvc获取方法参数的,理论上讲spingmvc可以直接将请求参数注入controller的参数中,说明它可以直接地获得真实的参数名。


正常情况下,反射是获取不到的,主要是编译的时候没有将参数名写入class文件?(因为经过实验使用idea编译的class文件即使有写入参数名,反射还是获取不到,如果在编译的时候没有,加入-parameters,当然这个不太重要)


那问题来了,我在controller里面写一段反射获取参数名,为啥也获取不到参数名呢?spingmvc用了什么技术它就可以获取到?asm吗?

img

img

该回答引用NewBing

你好,这是Bing。我可以帮你解答这个问题。😊


根据搜索结果①②③,Spring MVC 可以获取方法参数名的原因是它使用了 ASM 技术来解析字节码,从而得到参数名。ASM 是一个 Java 字节码操作和分析框架,可以直接操作类或者动态生成类。


反射获取不到参数名的原因是 Java 编译器默认不会将参数名写入 class 文件,除非使用 -parameters 或 -g:vars 选项编译。即使使用了这些选项,反射也需要 JDK 8 或以上版本才能支持 Parameter 类来获取参数名。


源: 与必应的对话, 2023/2/28

因为编译之后,参数名就变成arg0了,这个跟反射任何关系的