要获取method中parameter的注解值,需先通过getparameters()获取parameter数组,再调用其getannotation()等方法;注解必须声明为@retention(retentionpolicy.runtime),且仅java 8+支持。

Java 反射中,要获取 Method 对象中某个 Parameter 上的注解值,关键在于:先拿到 Parameter 实例,再调用其 getAnnotation(Class<t>)</t> 或 getAnnotations() 方法。注意——必须在编译时保留注解(@Retention(RetentionPolicy.RUNTIME)),否则运行时不可见。
确保注解具有 RUNTIME 保留策略
这是前提。如果注解定义时用了 RetentionPolicy.CLASS 或 SOURCE,反射将无法读取。
✅ 正确示例:
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME) // 必须是 RUNTIME
public @interface MyParam {
String value() default "";
}
通过 Method#getParameters() 获取 Parameter 数组
Method.getParameters() 返回按声明顺序排列的 Parameter 对象数组,索引与方法签名中参数位置一一对应。
例如方法:void test(@MyParam("a") String name, @MyParam("b") int age),则:
-
parameters[0]对应name参数,可获取其@MyParam注解 -
parameters[1]对应age参数,同理
从 Parameter 获取指定注解实例
每个 Parameter 支持直接查询注解,无需额外反射操作:
-
param.getAnnotation(MyParam.class)→ 返回该参数上@MyParam的实例(若存在) -
param.getAnnotations()→ 返回该参数所有运行时可见注解数组 -
param.isAnnotationPresent(MyParam.class)→ 判断是否存在该注解(轻量判断)
⚠️ 注意:Java 8+ 才支持 Parameter 上的注解;Java 7 及更早版本不支持参数级注解反射。
完整代码示例
假设已有 Method method,想获取第一个参数的 @MyParam 值:
Parameter[] parameters = method.getParameters();
if (parameters.length > 0) {
Parameter param = parameters[0];
MyParam annotation = param.getAnnotation(MyParam.class);
if (annotation != null) {
System.out.println("参数0 的注解值:" + annotation.value());
}
}











