题目
使用反射获取方法上的注解信息
信息
- 类型:问答
- 难度:⭐
考点
自定义注解定义,反射API使用,注解保留策略
快速回答
通过反射获取方法注解的步骤如下:
- 定义自定义注解并设置
@Retention(RetentionPolicy.RUNTIME) - 使用
Method.getAnnotation()或Method.getAnnotations()获取注解 - 检查注解是否存在并读取其属性值
原理说明
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