前端入参name和address,是如何与方法中的name和address绑定上的?
在Java8中,提供了编译时参数 -parameters ,之后就可以通过反射的机制,获取方法参数信息。使用 -parameters 编译的字节码中会带有 MethodParameters 属性,使用 StandardReflectionParameterNameDiscoverer#getParameterNames 来获取。
如果需要在Java8中开启参数获取,可如下配置maven插件
Java8之前,可以通过开启调试模式,即编译时添加编译参数 -g 。使用 -g 编译的字节码中会带有 LocalVariableTable 属性,使用Spring中的 LocalVariableTableParameterNameDiscoverer#getParameterNames 通过 ASM 框架来获取。
但是在我们正常使用Maven开发SpringMVC的过程中,并没有添加这些编译参数,SpringMVC又是如何实现参数绑定的呢?
原因就是Maven的compiler编译插件默认帮我们做了这件事。
Maven compiler插件有个debug属性,默认是true。如果改成false,则SpringMVC的参数注入会失效。
所以 ASM 框架获取参数名称也是有前提条件的,必须添加 -g 编译参数,否则该框架也是不可能能从class文件中猜出原始的参数名称。
Maven compiler插件文档
在使用SpringMVC时,我们想传递数组引用类型,SpringMVC对数组传递有些限制:经过测试:SpringMVC支持一维数组的参数传递,不支持多维数组的参数传递,如果想传递多维数组,那么我们只好改用其他的法如:1、将多维数组拆成一维数组;欢迎分享,转载请注明来源:内存溢出
评论列表(0条)