Spring MVC方法参数注入

我们都知道,Java源文件在编译成class文件后,所有的方法的参数名称信息都会丢失,因为方法的参数对于程序的运行毫无意义,之所以存在是为了提高程序的可读性,所有在编译之后就去掉了参数信息。但是很多程序在运行时又需要方法的参数信息,例如SpringMVC的在处理请求入参的时候。

@RequestMapping("hello")
public void getEnums(String name, String address)

前端入参name和address,是如何与方法中的name和address绑定上的?

在Java8中,提供了编译时参数-parameters,之后就可以通过反射的机制,获取方法参数信息。使用-parameters编译的字节码中会带有MethodParameters属性,使用StandardReflectionParameterNameDiscoverer#getParameterNames来获取。

如果需要在Java8中开启参数获取,可如下配置maven插件

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.7.0</version>
    <configuration>
        <compilerArgument>-parameters</compilerArgument>
    </configuration>
</plugin>

Java8之前,可以通过开启调试模式,即编译时添加编译参数-g。使用-g编译的字节码中会带有LocalVariableTable属性,使用Spring中的LocalVariableTableParameterNameDiscoverer#getParameterNames通过ASM框架来获取。

但是在我们正常使用Maven开发SpringMVC的过程中,并没有添加这些编译参数,SpringMVC又是如何实现参数绑定的呢?

原因就是Maven的compiler编译插件默认帮我们做了这件事。
Maven compiler插件有个debug属性,默认是true。如果改成false,则SpringMVC的参数注入会失效。

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.7.0</version>
    <configuration>
        <debug>false</debug>
    </configuration>
</plugin>

所以ASM框架获取参数名称也是有前提条件的,必须添加-g编译参数,否则该框架也是不可能能从class文件中猜出原始的参数名称。

Maven compiler插件文档

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 0. 写在前面 一次偶然写代码的时候想到这个问题,通过反射我们是无法得到方法参数的名称的,那么spring mvc...
    ImushroomT阅读 7,001评论 1 7
  • Java 8自Java 5(发行于2004)以来最具革命性的版本。Java 8 为Java语言、编译器、类库、开发...
    huoyl0410阅读 3,904评论 1 2
  • 经过Maven生命周期的学习,我们知道在Maven core中仅仅定义了抽象的生命周期,具体的实现是由插件完成的,...
    SonyaBaby阅读 5,138评论 0 3
  • 生命周期是maven的又一大核心,maven的生命周期是抽象的,而实际行为都是以插件的方式来完成的,下面我将对生命...
    小炼君阅读 5,022评论 0 50
  • 自打《延禧攻略》开播, 范范就被魏姐深深的俘虏了 这个夏天看着我魏姐一己之力 肩挑整个紫禁城的便当行, 时不时给小...
    范服饰时尚职业装阅读 3,655评论 0 0

友情链接更多精彩内容