Java反射默认无法获取方法参数真实名称,需通过编译时添加-parameters选项并使用Method.getParameters()获取Parameter对象,进而取得参数名及@Retention(RUNTIME)注解。

Java 反射默认无法直接获取方法参数的**真实名称**(如 String userName 中的 userName),因为编译后字节码中参数名通常被擦除为 arg0、arg1 等。但通过特定编译配置和反射 API,可以动态获取参数名及其上声明的注解(如 @NotNull、@RequestParam 等)。关键在于启用调试信息保留 + 使用 Parameter API。
确保编译时保留参数名(必需步骤)
这是整个方案的前提。JDK 8+ 默认不保留参数名,需显式开启:
- 使用
-parameters编译选项(推荐):
javac -parameters YourClass.java - Maven 用户在
pom.xml中配置:
<plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-compiler-plugin</artifactid><version>3.8.1</version><configuration><parameters>true</parameters></configuration></plugin>
Gradle 用户添加:
compileJava.options.parameters = true
用 Parameter API 获取参数名与注解
通过 Method.getParameters() 返回 Parameter[],每个 Parameter 对象封装了名称、类型及注解信息:
Method method = YourClass.class.getDeclaredMethod("updateUser", String.class, Integer.class);
Parameter[] parameters = method.getParameters();
for (Parameter param : parameters) {
String paramName = param.getName(); // 如 "userName", "age"
Class> paramType = param.getType(); // 如 String.class
Annotation[] annotations = param.getAnnotations(); // 所有运行时注解
System.out.println("参数名: " + paramName + ", 类型: " + paramType.getSimpleName());
for (Annotation ann : annotations) {
System.out.println(" 注解: " + ann);
}
}
注意:只有 @Retention(RetentionPolicy.RUNTIME) 的注解才能通过 getAnnotations() 获取。
获取特定类型的注解(更实用)
实际开发中常需提取某类注解(如 Spring 的 @PathVariable),推荐用 getAnnotation(Class:
RequestParam reqParam = param.getAnnotation(RequestParam.class);NotNull notNull = param.getAnnotation(NotNull.class);- 若注解存在则返回实例,否则返回
null,避免空指针
也可用 isAnnotationPresent(...) 先判断再获取,逻辑更清晰。
兼容 JDK 7 或未开启 -parameters 的情况
若无法控制编译环境(如第三方 jar),可借助以下方式间接推断参数名:
- 解析方法签名字符串(不推荐,脆弱且无注解信息)
- 使用 ASM 或 Javassist 在字节码层面读取调试信息(复杂,适合框架层)
- 约定注解携带名称(如自定义
@MyParam(name="userId")),手动提取
生产项目建议统一启用 -parameters,这是最标准、轻量、可靠的方案。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











