通过反射获取方法参数名时遇到的小坑

最近在写一个项目时需要通过反射获取方法的参数名,在method.getParameters()拿到的是一些arg0 arg1 arg2 …之类的无意义参数。

img

查原因发现是在Java8之前,代码编译为class文件后,方法参数的类型是固定的,但参数名称却丢失了,这和动态语言严重依赖参数名称形成了鲜明对比。(java是静态语言,所以入参名称叫什么其实无所谓的)。

但有些时候我们需要获取到准确的参数名来做一些操作,如果项目依赖Spring,那么Spring中有相关工具:

1
String[] parameterNames = new LocalVariableTableParameterNameDiscoverer().getParameterNames(method);

Java在1.8开始也支持此操作了,只是在编译时需要有编译选项:javac -parameters 默认是关闭的。

在Idea中我们可以通过设置来添加编译选项,路径为:

Setting > Build, Excution, Deployment > Compiler > Java Compiler > Additional command line parameters:

在里面输入: -parameters 就可以了。

img

这种方式毕竟只是临时解决,其他人拿到你的代码如果没有设置这个还是会出现拿不到参数名的情况。还有一种解决方式,在pom文件中添加编译参数:-parameters

1
2
3
4
5
6
7
8
9
10
11
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgument>-parameters</compilerArgument>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>

再次通过method.getParameters()获取参数:

img

这样就一劳永逸了。都是些小细节,做个笔记,防止以后忘记了。

明人不说暗话,如果你觉得可以的话,你懂的!