Java编译参数-parameters
有个项目最开始gradle,打算边写边学习,最近不知道为什么一直编译失败,一直没找到原因。索性又改为maven了,在改的时候springboot采用的是3.1.5
,里面的spring版本是6.0
。在改为maven时顺手改为3.2.1
,之后调用接口一直失败。提示
1 | exception Name for argument of type [java.lang.Integer] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the |
其实在spring wiki里面有写,升级注意事项,之前没看见,后面才注意,因为LocalVariableTableParameterNameDiscoverer
在spring6.1里面已经删除。
Upgrading-to-Spring-Framework-6.x
Spring-Boot-3.2-Release-Notes
以前LocalVariableTableParameterNameDiscoverer
是会读取解析对象class文件后通过LocalVariableTable
拿到参数名称。
解决办法是添加
1 | <plugin> |
如果使用的是
spring-boot-starter-parent
,然后添加了插件spring-boot-maven-plugin
是没问题的,因为插件默认会添加-parameters
编译测试
创建一个类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
public class Demo {
public static void main(String[] args) throws Exception {
Method method = Demo.class.getMethod("demo", Integer.class);
Parameter[] parameters = method.getParameters();
for (Parameter parameter : parameters) {
System.out.println(parameter.getName());
}
}
public void demo(Integer id) {
System.out.println(id);
}
}
使用命令编译javac Demo.class
然后运行java Demo
输出得到 arg0
添加参数后命令javac -parameters Demo.java
,然后运行得到 id
实际上通过javap -v
反编译class后可以看到添加参数后会多出 MethodParameters 里面就有名称 id
如果通过添加参数javac -g:vars
编译,反编译后可以看到里面有添加LocalVariableTable
,之前应该是maven编译的默认存在,所以之前Spring能获取到参数名称