基本原理與架構(gòu)
頂層核心 Annotation 架構(gòu)與 JVM 層面的處理
- interface Annotation
- @Target ,元注解
- ElementType[] value()
- 表示適用的范圍,它決定了對應(yīng)標(biāo)簽的可標(biāo)注位置,可以是多個
- @Retention,元注解
- RetentionPolicy value();
- 表示運行的范圍,它決定了對應(yīng)標(biāo)簽的生效時機(jī),只能是一種
- @Inherited,元注解
- 被標(biāo)注的對象被繼承時,同樣具有該注解相等效果
- @Native,元注解
- 1.8新增,注解一個成員變量,指示這個變量可以被本地代碼引用。常常被代碼生成工具使用
- @Repeatable,元注解
- 1.8新增,表示該定義的注解可以被重復(fù)添加至需要的位置
其他 Java 自帶的 Annotation
- @Documented,元注解
- 是否可以生成 Java 文檔,javadoc等工具可以提取這些注解信息
- @Deprecated
- @Override
- @SuppressWarnings
- @SafeVarargs
- @FunctionalInterface
使用
反射判斷與獲取 Annotation
- java.lang.reflect.AnnotatedElement,反射如何判斷與獲取 Annotation
- isAnnotationPresent(Class<? extends Annotation> annotationClass) 方法,表示判斷當(dāng)前位置是否有該注解,一般先做判斷再獲取
- getAnnotation 方法,表示獲取具體位置配置的 Annotation的對象,從而可以拿到 Annotation上具體配置的信息
- 各種反射類實現(xiàn) AnnotatedElement 接口
- Field extends AccessibleObject implements AnnotatedElement
- Class<T> implements AnnotatedElement (重寫了)
- Method
- ... todo
使用方式與一些最佳實踐
- 編譯期
- Lombok,生成字節(jié)碼的過程中通過 Annotation 增強(qiáng)
- 運行期
- 全量掃描,Spring
- AOP,Spring
- API調(diào)用,自定義 Annotation