自定义 Annotation 与使用
2022-03-02 本文已影响0人
lz做过前端
基本原理与架构
顶层核心 Annotation 架构与 JVM 层面的处理
- interface Annotation
- @Target ,元注解
- ElementType[] value()
- 表示适用的范围,它决定了对应标签的可标注位置,可以是多个
- @Retention,元注解
- RetentionPolicy value();
- 表示运行的范围,它决定了对应标签的生效时机,只能是一种
- @Inherited,元注解
- 被标注的对象被继承时,同样具有该注解相等效果
- @Native,元注解
- 1.8新增,注解一个成员变量,指示这个变量可以被本地代码引用。常常被代码生成工具使用
- @Repeatable,元注解
- 1.8新增,表示该定义的注解可以被重复添加至需要的位置
其他 Java 自带的 Annotation
- @Documented,元注解
- 是否可以生成 Java 文档,javadoc等工具可以提取这些注解信息
- @Deprecated
- @Override
- @SuppressWarnings
- @SafeVarargs
- @FunctionalInterface
使用
反射判断与获取 Annotation
- java.lang.reflect.AnnotatedElement,反射如何判断与获取 Annotation
- isAnnotationPresent(Class<? extends Annotation> annotationClass) 方法,表示判断当前位置是否有该注解,一般先做判断再获取
- getAnnotation 方法,表示获取具体位置配置的 Annotation的对象,从而可以拿到 Annotation上具体配置的信息
- 各种反射类实现 AnnotatedElement 接口
- Field extends AccessibleObject implements AnnotatedElement
- Class<T> implements AnnotatedElement (重写了)
- Method
- ... todo
使用方式与一些最佳实践
- 编译期
- Lombok,生成字节码的过程中通过 Annotation 增强
- 运行期
- 全量扫描,Spring
- AOP,Spring
- API调用,自定义 Annotation