必须在编译时添加 -parameters 参数才能使 Parameter.getName() 返回真实形参名;JDK ≥ 8(推荐 ≥ 8u60),IDE 和构建工具需手动启用,否则返回 arg0、arg1。

在 Java 中,通过反射获取方法参数的真实形参名(比如 public void setName(String name) 中的 "name"),需要使用 java.lang.reflect.Parameter.getName() 方法。但默认情况下,编译后的 .class 文件不保留形参名信息,调用 getName() 会返回 arg0, arg1 这样的占位符名称。
要让 Parameter.getName() 返回源码中定义的真实参数名,必须在编译时添加以下参数:
编译时需加 -parameters 参数
javac -parameters MyClass.java
✅ 这是 JDK 8 引入的功能(JSR 269 相关),要求:
- JDK 版本 ≥ 8(推荐 ≥ 8u60,早期版本可能存在兼容性问题)
- 编译时显式指定
-parameters - 运行时无需额外 JVM 参数,反射即可正常工作
如何验证是否生效?
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
public class Test {
public void example(String username, int age) {}
public static void main(String[] args) throws Exception {
Method m = Test.class.getDeclaredMethod("example", String.class, int.class);
Parameter[] params = m.getParameters();
for (Parameter p : params) {
System.out.println(p.getName()); // 输出 "username", "age"(若编译加了 -parameters)
}
}
}⚠️ 注意:
立即学习“Java免费学习笔记(深入)”;
- 如果没加
-parameters,输出是arg0,arg1 - IDE(如 IntelliJ)默认不会自动加
-parameters,需手动配置编译选项 - Maven 用户需在
maven-compiler-plugin中启用:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>8</source>
<target>8</target>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>Gradle 用户可在 build.gradle 中配置:
compileJava {
options.compilerArgs += '-parameters'
}补充说明:IDE 和调试支持
IntelliJ IDEA:
Settings → Build → Compiler → Java Compiler → Additional command line parameters→ 填入-parametersEclipse:
Preferences → Java → Compiler → Store information about method parameters (usable via reflection)→ ✅ 勾选(等效于-parameters)
不复杂但容易忽略


















