Java中可通过反射获取方法注解并读取其属性值:先用getDeclaredMethod()或getMethod()获取方法对象,再调用getAnnotation()获取注解实例,最后直接调用其方法(如value()、timeout())获取配置;注意判空、访问权限及重复注解需用getAnnotationsByType()。

Java 中可以通过反射获取方法上的注解,并调用其方法(如 value()、name() 等)来读取配置参数。关键在于:先获取目标方法,再用 getMethod().getAnnotation(XXX.class) 拿到注解实例,最后像调用普通方法一样访问注解属性。
获取方法并检查是否存在指定注解
使用 Class.getDeclaredMethod() 或 Class.getMethod() 获取方法对象,然后调用 getAnnotation()。注意:
-
getDeclaredMethod()可获取私有/包级方法,但需配合setAccessible(true); -
getMethod()只能获取 public 方法(含父类继承的); - 若注解不存在,
getAnnotation()返回null,务必判空。
读取注解的配置参数(即属性值)
注解本质是接口,JVM 会为每个注解实例生成代理对象。你可以直接调用其声明的方法来获取值:
- 例如自定义注解
@MyLog(level = "INFO", topic = "user"),可通过anno.level()和anno.topic()获取; - 如果属性有默认值(如
String value() default "";),未显式配置时会返回默认值; - 数组类型属性(如
String[] tags() default {};)返回的是真实数组,可直接遍历。
处理重复注解(@Repeatable)
从 Java 8 起支持重复注解。此时不能用 getAnnotation(),而应使用 getAnnotationsByType():
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 被
@Repeatable(Container.class)标记的注解,需定义对应容器注解Container; - 调用
method.getAnnotationsByType(MyAnnotation.class)返回MyAnnotation[]; - 它自动展开容器中的值,比手动取
Container.value()更简洁安全。
完整示例代码片段
假设有一个自定义注解和测试方法:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiVersion {
String value() default "v1";
int timeout() default 3000;
}
public class Service {
@ApiVersion(value = "v2", timeout = 5000)
public void fetchData() { }
}
反射读取方式如下:
Method m = Service.class.getDeclaredMethod("fetchData");
ApiVersion anno = m.getAnnotation(ApiVersion.class);
if (anno != null) {
System.out.println("版本: " + anno.value()); // 输出 v2
System.out.println("超时: " + anno.timeout()); // 输出 5000
}

















