java 8 的 parameter 类可获取方法参数真实名称,但需编译时启用 -parameters 选项;否则 getname() 返回 arg0 等伪名;maven、gradle、命令行及 ide 均需配置该选项;通过 method.getparameters() 获取 parameter 数组,调用 getname()、gettype() 和 isnamepresent() 等方法获取信息,并支持读取 runtime 级注解。

Java 8 引入了 Parameter 类,让反射能直接拿到方法参数的真实名称(比如 userName、age),但前提是编译时必须开启参数名保留功能。默认情况下,字节码里参数名会被替换成 arg0、arg1 这类占位符,所以光靠反射 API 是不够的。
编译时启用 -parameters 选项
这是最关键的一步,没有它,Parameter.getName() 永远返回 arg0 这样的伪名。
- Maven 项目:在
pom.xml的maven-compiler-plugin中添加配置
- Gradle 项目:在
build.gradle中添加
- 命令行编译:用
javac -parameters YourClass.java - IDE 设置:IntelliJ 在 Settings → Build → Java Compiler 中勾选 “Add ‘-parameters’ to javac”;Eclipse 在 Preferences → Java → Compiler 中启用 “Store information about method parameters (usable via reflection)”
用 Method.getParameters() 获取参数信息
拿到 Method 对象后,调用 getParameters() 返回 Parameter[],每个 Parameter 就对应一个形参。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
param.getName()返回源码中写的参数名(如"username"),前提是已启用-parameters -
param.getType()返回参数类型(如String.class) -
param.isNamePresent()可用来判断当前 class 是否真的包含参数名信息(调试时有用)
示例代码:
Method m = UserService.class.getMethod("updateUser", String.class, int.class);for (Parameter p : m.getParameters()) {
System.out.println(p.getName() + " → " + p.getType().getSimpleName());
}
同时获取参数上的注解
参数名和注解常一起使用,比如 Spring 的 @RequestParam("id") 或校验注解 @NotNull。
-
param.getAnnotations()返回所有@Retention(RUNTIME)的注解 -
param.getAnnotation(NotNull.class)直接获取指定类型的注解实例,更常用也更安全 - 注意:只有声明为
@Retention(RetentionPolicy.RUNTIME)的注解才能在运行时通过反射读到
验证参数名是否生效的小技巧
写个简单测试方法,比如 void test(String name, List<string> tags)</string>,然后反射打印参数名。如果输出是 name 和 tags,说明配置成功;如果还是 arg0、arg1,就回头检查编译配置或 IDE 设置是否生效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










