Spring如何在没有调试信息的情况下获取参数名称


问题内容
@RequestMapping("/form")
public String form(Model model, Integer id)

例如,spring可以知道参数id的名称为id并在运行时将请求参数的值绑定到该参数


问题答案:

这是JDK 8中引入的javac的功能。您需要包括-parametersjavac命令行选项才能将其激活。然后,您将能够获得像这样的参数名称:

String name = String.class.getMethod("substring", int.class).getParameters()[0].getName()
System.out.println(name);

从Spring文档3.3 Java
8(以及6和7)开始

您还可以使用Java 8的参数名称发现(基于-parameters编译器标志)来替代启用了调试信息的代码。

ParameterNameDiscoverer类的javadoc中所指定:

参数名称发现并不总是可能的,但是可以尝试各种策略,例如寻找可能在编译时发出的调试信息,以及寻找可选地带有AspectJ注释方法的argname注释值。

这是Spring项目Java
8参数名称发现中有关方法和构造函数的
相关JIRA项目的链接

JDK增强建议JEP 118:在运行时访问参数名称