【Java 注解】自定义注解 ( 元注解 )
文章目錄
- 一、元注解
- 二、常用的元注解類型
- 三、@Target 元注解
- 四、@Retention 元注解
- 五、@Documented 元注解
- 六、@Documented 元注解
一、元注解
元注解 是 描述 注解 的 注解 ;
以 Override 注解為例 , 分析下該注解的 元注解 含義 :
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }@Target 注解用于說明該注解作用位置 , ElementType.METHOD 表示該注解用于標注 方法 ; 注解的作用位置 : 包 , 類 , 成員變量 , 方法 , 方法參數 , 局部變量 , 666 個作用位置 ;
@Retention 注解用于說明該注解需要保留到什么階段 , RetentionPolicy.SOURCE 表示保留到源碼中 , SOURCE 階段 ( 源代碼階段 ) ; Java 代碼的三個階段分別是 : 源代碼階段 , 類對象階段 , 運行時階段 ;
元注解的個數是有限的 , JDK 已經定義好 ;
二、常用的元注解類型
@Target : 描述 注解 的作用位置 , 包 , 類 , 成員變量 , 方法 , 方法參數 , 局部變量 , 666 個作用位置 ;
@Retention : 描述 注解 被保留的階段 , 源代碼階段 , 類對象階段 , 運行時階段 ;
@Documented : 描述 注解 是否需要被抽取到文檔中 , 在使用 javadoc 命令生成文檔時 , 該 注解 是否生成到文檔中 ;
@Inherited : 描述 注解 是否被子類繼承 , 如果添加了該注解 , 則子類會自動繼承父類的注解 ;
三、@Target 元注解
查看 Target 注解的源碼 , 該注解只有 111 個注解屬性 , 且屬性值是 value , 因此在給 注解屬性 賦值時 , 可以省略 注解屬性名稱 ;
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Target {ElementType[] value(); }value 注解屬性 的類型是 ElementType[] 數組類型 , 代表 注解 作用的位置 ; 可以設置的位置參考 ElementType 枚舉類 ;
- ElementType.TYPE : 注解作用于類上 ;
- ElementType.FIELD: 注解作用于字段上 ;
- ElementType.METHOD : 注解作用于方法上 ;
@Target 使用示例 : 使用 @Target(ElementType.TYPE) 設置注解作用位置必須是 類 / 接口 / 枚舉 , 將 @Annotation 標注在其它位置會報錯 ;
@Target(ElementType.TYPE) public @interface Annotation { }作用域構造函數上 , 報如下錯誤 ;
被 @Target(ElementType.TYPE) 元注解修飾的 Annotation 注解 , 只能在 類 上進行標注 ;
@Annotation(stringValue = "tom",enumValue = Number.ONE,annotationValue = @Annotation2,stringArrayValue = {"tom", "jerry"}) public class Student { }Target 注解中 , ElementType[] value() 注解屬性的類型是數組類型 , 說明可以設置多個 注解 標注 位置 ;
如 : 使用如下
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})元注解修飾 Annotation 注解 , 則可以同時在 類 , 字段 和 方法上使用該 Annotation 注解 ;
四、@Retention 元注解
@Retention 注解用于說明該注解需要保留到什么階段 ;
Java 代碼的三個階段分別是 : 源代碼階段 , 類對象階段 , 運行時階段 ;
查看 Retention 源碼 ,
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Retention {RetentionPolicy value(); }Retention 注解的 注解屬性 RetentionPolicy value() , 其類型是 RetentionPolicy 枚舉類型 , 三個枚舉值 , 分別對應 Java 代碼三大階段 源代碼階段 , 類對象階段 , 運行時階段 ;
public enum RetentionPolicy {/** * 源代碼階段* 編譯器丟棄該注解.*/SOURCE,/** * 類對象階段* 注解會被保存到字節碼文件中, 不會被 JVM 讀取到.*/CLASS,/** * 運行時階段* 注解會被保存到字節碼文件中, 并會被 JVM 讀取到.** @see java.lang.reflect.AnnotatedElement*/RUNTIME }一般情況下 , 開發則自定義注解 , 都是在運行時進行一些代碼分析 , 設置 RetentionPolicy.RUNTIME 注解屬性 ;
@Retention(RetentionPolicy.RUNTIME)五、@Documented 元注解
如果添加了該注解 , 表示當前注解會被抽取到 Java API 文檔中 ;
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Documented { }使用 javadoc Student.java 命令 , 生成 Java 文檔 ; 如果使用 @Documented 注解修飾 Annotation 注解 , 則導出的文檔如下 , 在類和方法的上面會顯示相應注解 ;
如果不使用 @Documented 注解 , 則生成的文檔中沒有 Annotation 注解 ;
六、@Documented 元注解
@Inherited : 描述 注解 是否被子類繼承 , 如果添加了該注解 , 則子類會自動繼承父類的注解 ;
使用 @Inherited 元注解 標注 Annotation 注解 ;
使用 Annotation 注解 標注父類 Person ;
子類 Student 繼承 Person 類 , 子類中不添加注解 , 那么父類 Person 中的注解自動添加給子類 Student ;
總結
以上是生活随笔為你收集整理的【Java 注解】自定义注解 ( 元注解 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 文件管理】分区存储 (
- 下一篇: 【错误记录】Android 低版本使用分