反射在项目中会经常被用到,比如优化项目结构,比如解析协议格式等。在使用反射时,经常会用来调用某个对象的方法,通过反射来调用对象中的方法时,也需要给方法的参数进行赋值。当方法的参数来自于外部输入时,在反射中就可能需要拿到方法的参数名称。默认情况下通过反射获得的方法参数名为 arg0、arg1 (也有可能是 var1 和 var2)这样的,那么就无法对方法进行传参了。
比如,当我们输入的 URI 为 pwd=1234567&name=zhangsan,而 Controller 中的 login 方法的参数为 String name, String pwd 时,通过反射给调用 login 方法时,就需要明确知道 login 的两个参数名了。通过参数名 name 可以得到 uri 中 name 的值(类似 request.getParameter("name")这样的代码),通过参数 pwd 可以得到 uri 中 pwd 的值。如果反射获取到的参数名是 arg0、arg1、var1、var2 这样的话,就无法得到 URI 传递来的值了。
因此,本文就简单说说如何让反射获取到方法参数实际的变量名的设置方法吧。
IDEA 的设置方法
在 JDK 1.8 提供了 -parameters 参数,它会将 Java 代码中的方法的参数名写入到 .class 文件中。具体在 IDEA 中的设置方法为:File -> Settings -> Build -> Compiler -> Java Compiler,具体如下图:
然后,在 Additional command line parameters: 中设置即可。
-parameters 的作用是:生成元数据以用于方法参数的反射。这个解释是 javac 命令给出的解释。
Maven 的设置方法
当项目使用 Maven 构建时,需要通过 Maven 的插件来进行设置,Maven 的配置如下所示:
<build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.8.0</version><configuration><source>1.8</source><target>1.8</target><encoding>utf8</encoding><compilerArgs><arg>-parameters</arg></compilerArgs></configuration></plugin></plugins></build>
上面就是”可以让反射获取到方法参数实际的变量名“设置的方法。从上面的 XML 来看,其实还是使用了 -parameters 的编译参数,只是指定的方式有所不同而已。