Something

首页 / 文章 / RSS

如何在编译Java时保留方法参数名

在Java 8之前的版本,代码编译为class文件后,方法参数的类型是固定的,但参数名称却丢失了,参数名会变成arg0、arg1….。而现在,在Java8开始可以在class文件中保留参数名,这就给反射带来了极大的遍历。 如果需要保留方法参数名,在编译时,可以启用 -parameters 选项,默认情况下此选项是关闭的。

本文将介绍编译Java源代码时,如何在maven, eclipse, idea中启用 parameters 选项。

示例

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class Task {

  public void execute(int num, String message) {
  }

  public static void main(String[] args) throws NoSuchMethodException {
      Method m = Task.class.getDeclaredMethod("execute", int.class, String.class);
      for (Parameter p : m.getParameters()) {
          System.out.printf("name: %s, type: %s%n", p.getName(), p.getType());
      }
  }
}

未开启 -parameters 选项时,编译并运行。

$ javac Task.java 
$ java Task
name: arg0, type: int
name: arg1, type: class java.lang.String

开启 -parameters 选项时,编译并运行。

$ javac -parameters Task.java 
$ java Task
name: num, type: int
name: message, type: class java.lang.String

Maven设置

.............
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.7.0</version>
  <configuration>
    <source>10</source>
    <target>10</target>
    <encoding>UTF-8</encoding>
    <compilerArgs>
      <arg>-parameters</arg>
    </compilerArgs>
  </configuration>
</plugin>
..........

Eclipse设置

Preferences -> java -> Compiler 下勾选 Store information about method parameters 选项。

Idea设置

File -> Settings -> Build,Execution,Deployment -> Java Compiler 下的 Additional command line parameters 选项中添加 -parameters