直接调用Method.getAnnotation(Class<T> annotationClass)可获取方法上声明的指定自定义注解,但前提是该注解必须使用@Retention(RetentionPolicy.RUNTIME)声明,否则运行时返回null;还需确保@Target包含ElementType.METHOD、注解类为public、目标方法可访问,并判空处理返回结果。

直接调用 Method.getAnnotation(Class<T> annotationClass) 即可获取方法上声明的指定自定义注解,前提是该注解的 @Retention 必须是 RetentionPolicy.RUNTIME,否则运行时无法读取。
确保自定义注解支持运行时保留
这是最关键的一步。如果注解没有正确声明保留策略,getAnnotation 会始终返回 null。
正确写法示例:
❌ 错误(默认为 CLASS,不可在运行时读取):@interface MyAnnotation { String value() default ""; }
✅ 正确(显式声明 RUNTIME):
@Retention(RetentionPolicy.RUNTIME)<br>@Target(ElementType.METHOD)<br>public @interface MyAnnotation {<br> String value() default "";<br>}
在目标方法上添加注解并反射获取
定义好注解后,在方法上使用它,再通过反射拿到 Method 对象,调用 getAnnotation。
立即学习“Java免费学习笔记(深入)”;
- 使用
Class.getDeclaredMethod(String name, Class>... parameterTypes)获取方法对象 - 调用
method.getAnnotation(MyAnnotation.class) - 注意:方法必须是 public 或 setAccessible(true),否则可能因访问权限抛出异常
示例代码:
public class Example {<br> @MyAnnotation("hello")<br> public void testMethod() {}<br>}<br><br>// 反射获取<br>Method method = Example.class.getDeclaredMethod("testMethod");<br>MyAnnotation ann = method.getAnnotation(MyAnnotation.class);<br>if (ann != null) {<br> System.out.println(ann.value()); // 输出 "hello"<br>}
处理注解不存在或为 null 的情况
getAnnotation 在未声明对应注解时返回 null,不是异常,所以务必判空。
- 不要直接链式调用
getAnnotation(...).value(),避免 NPE - 若需多个注解,可用
getAnnotationsByType或getDeclaredAnnotations() - 注意:
getAnnotation只查直接声明的注解,不继承父类/接口中的同名注解(除非注解本身标注了@Inherited,但该元注解对方法无效)
常见陷阱提醒
几个容易踩坑的点:
-
@Target没包含ElementType.METHOD→ 编译不通过或 IDE 报错 - 注解类没加
public修饰符 → 反射时可能因包访问权限失败 - 方法被子类重写,但注解没加到子类方法上 → 父类上的注解不会自动继承到子类方法
- 使用 Lombok 等字节码增强工具时,生成的方法可能不含源码中写的注解(需确认注解是否被复制到生成方法)


















