侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

使用反射获取方法上的注解信息

2025-12-13 / 0 评论 / 4 阅读

题目

使用反射获取方法上的注解信息

信息

  • 类型:问答
  • 难度:⭐

考点

自定义注解定义,反射API使用,注解保留策略

快速回答

通过反射获取方法注解的步骤如下:

  1. 定义自定义注解并设置@Retention(RetentionPolicy.RUNTIME)
  2. 使用Method.getAnnotation()Method.getAnnotations()获取注解
  3. 检查注解是否存在并读取其属性值
## 解析

原理说明

Java反射允许在运行时检查类、方法和字段的元数据。注解需要设置@Retention(RetentionPolicy.RUNTIME)才能在运行时通过反射获取。核心API:

  • Class.getDeclaredMethods() - 获取类中所有方法
  • Method.getAnnotation(Class) - 获取方法上的特定注解

代码示例

1. 定义自定义注解

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME) // 关键:设置运行时保留
public @interface AuthorInfo {
    String name();
    String date();
}

2. 在方法上使用注解

public class UserService {
    @AuthorInfo(name = "Alice", date = "2023-10-01")
    public void createUser() {
        // 方法实现
    }
}

3. 通过反射获取注解

import java.lang.reflect.Method;

public class AnnotationReader {
    public static void main(String[] args) throws NoSuchMethodException {
        // 获取目标方法
        Method method = UserService.class.getDeclaredMethod("createUser");

        // 检查并读取注解
        if (method.isAnnotationPresent(AuthorInfo.class)) {
            AuthorInfo annotation = method.getAnnotation(AuthorInfo.class);
            System.out.println("作者: " + annotation.name());
            System.out.println("日期: " + annotation.date());
        }
    }
}

最佳实践

  • 检查注解存在性:先使用isAnnotationPresent()避免NullPointerException
  • 精确获取方法:使用getDeclaredMethod(name, parameterTypes)指定方法名和参数类型
  • 性能考虑:反射操作较慢,避免在高频代码中使用

常见错误

  • 缺少保留策略:未设置@Retention(RetentionPolicy.RUNTIME)导致运行时无法获取注解
  • 方法匹配错误:重载方法需指定参数类型,如getDeclaredMethod("createUser", String.class)
  • 忽略访问权限:私有方法需先调用method.setAccessible(true)

扩展知识

  • 注解继承:默认不继承到子类,可通过@Inherited实现类级别的注解继承
  • 其他反射API
    • Field.getAnnotations() - 获取字段注解
    • Class.getAnnotation() - 获取类注解
  • 注解处理器:编译时处理注解(如Lombok),需使用RetentionPolicy.SOURCE