题目
使用反射检查类上的自定义注解
信息
- 类型:问答
- 难度:⭐
考点
自定义注解定义,反射获取注解,注解保留策略
快速回答
实现步骤:
- 使用
@interface定义注解并设置@Retention(RetentionPolicy.RUNTIME) - 在目标类上添加自定义注解
- 通过反射获取类的
Class对象 - 使用
getAnnotation()方法检查注解是否存在
原理说明
Java反射允许在运行时检查类信息,注解需要设置@Retention(RetentionPolicy.RUNTIME)才能在运行时通过反射获取。核心步骤:定义注解→标记类→反射检查。
代码示例
// 1. 定义注解
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "";
}
// 2. 标记类
@MyAnnotation("测试类")
public class MyClass {}
// 3. 反射检查
public class AnnotationChecker {
public static void main(String[] args) {
Class<?> clazz = MyClass.class;
MyAnnotation annotation = clazz.getAnnotation(MyAnnotation.class);
if (annotation != null) {
System.out.println("找到注解! 值: " + annotation.value());
} else {
System.out.println("未找到注解");
}
}
}最佳实践
- 始终为运行时注解设置
@Retention(RetentionPolicy.RUNTIME) - 使用
getAnnotation()而非getAnnotations()获取特定注解 - 检查注解非空后再读取属性值
常见错误
- 忘记保留策略:未设置
RetentionPolicy.RUNTIME导致反射无法获取 - 大小写错误:
getAnnotation()方法名拼写错误 - 类加载问题:未导入注解类或类路径错误
扩展知识
- 元注解:
@Target指定注解使用位置(类/方法/字段等) - 注解继承:类注解默认不被子类继承,需配合
@Inherited - 性能考虑:反射操作较慢,避免在高频代码中使用