日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【Java 注解】自定义注解 ( 元注解 )

發布時間:2025/6/17 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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 : 注解作用于方法上 ;
public enum ElementType {/** 類 , 接口 (包括注解類型) , 枚舉類型 聲明 */TYPE,/** 字段 (包括枚舉常量) */FIELD,/** 方法聲明 */METHOD,/** 普通參數聲明 */PARAMETER,/** 構造函數聲明 */CONSTRUCTOR,/** 局部變量聲明 */LOCAL_VARIABLE,/** 注解類型聲明 */ANNOTATION_TYPE,/** 包聲明 */PACKAGE,/*** 類型參數聲明** @since 1.8*/TYPE_PARAMETER,/*** 使用一個類型** @since 1.8*/TYPE_USE }

@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 注解】自定义注解 ( 元注解 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。