Java的面向?qū)ο缶幊?/a>">Java的面向?qū)ο缶幊?/a>
885
2025-03-31
文章目錄
一、元注解
二、常用的元注解類型
三、@Target 元注解
四、@Retention 元注解
五、@Documented 元注解
六、@Documented 元注解
一、元注解
元注解 是 描述
注解
的
注解 ;
以 Override 注解為例 , 分析下該注解的 元注解 含義 :
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }
1
2
3
4
@Target 注解用于說明該注解作用位置 , ElementType.METHOD 表示該注解用于標(biāo)注 方法 ; 注解的作用位置 :
包 ,
類 ,
成員變量 ,
方法 ,
方法參數(shù) ,
局部變量 ,
6 6 6 個作用位置 ;
@Retention 注解用于說明該注解需要保留到什么階段 , RetentionPolicy.SOURCE 表示保留到源碼中 , SOURCE 階段 ( 源代碼階段 ) ; Java 代碼的三個階段分別是 :
源代碼階段 ,
類對象階段 ,
運行時階段 ;
元注解的個數(shù)是有限的 , JDK 已經(jīng)定義好 ;
二、常用的元注解類型
@Target : 描述 注解 的作用位置 ,
包 ,
類 ,
成員變量 ,
方法 ,
方法參數(shù) ,
局部變量 ,
6 6 6 個作用位置 ;
@Retention : 描述 注解 被保留的階段 ,
源代碼階段 ,
類對象階段 ,
運行時階段 ;
@Documented : 描述 注解
是否需要被抽取到文檔中
, 在使用 javadoc 命令生成文檔時 , 該 注解 是否生成到文檔中 ;
@Inherited : 描述 注解
是否被子類繼承
, 如果添加了該注解 , 則子類會自動繼承父類的注解 ;
三、@Target 元注解
查看 Target 注解的源碼 , 該注解只有 1 1 1 個注解屬性 , 且屬性值是 value , 因此在給 注解屬性 賦值時 , 可以省略 注解屬性名稱 ;
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Target { ElementType[] value(); }
1
2
3
4
5
6
value 注解屬性 的類型是 ElementType[] 數(shù)組類型 , 代表 注解 作用的位置 ; 可以設(shè)置的位置參考 ElementType 枚舉類 ;
ElementType.TYPE : 注解作用于類上 ;
ElementType.FIELD: 注解作用于字段上 ;
ElementType.METHOD : 注解作用于方法上 ;
public enum ElementType { /** 類 , 接口 (包括注解類型) , 枚舉類型 聲明 */ TYPE, /** 字段 (包括枚舉常量) */ FIELD, /** 方法聲明 */ METHOD, /** 普通參數(shù)聲明 */ PARAMETER, /** 構(gòu)造函數(shù)聲明 */ CONSTRUCTOR, /** 局部變量聲明 */ LOCAL_VARIABLE, /** 注解類型聲明 */ ANNOTATION_TYPE, /** 包聲明 */ PACKAGE, /** * 類型參數(shù)聲明 * * @since 1.8 */ TYPE_PARAMETER, /** * 使用一個類型 * * @since 1.8 */ TYPE_USE }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@Target 使用示例 : 使用 @Target(ElementType.TYPE) 設(shè)置注解作用位置必須是 類 / 接口 / 枚舉 , 將 @Annotation 標(biāo)注在其它位置會報錯 ;
@Target(ElementType.TYPE) public @interface Annotation { }
1
2
3
作用域構(gòu)造函數(shù)上 , 報如下錯誤 ;
被 @Target(ElementType.TYPE) 元注解修飾的 Annotation 注解 , 只能在 類 上進行標(biāo)注 ;
@Annotation( stringValue = "tom", enumValue = Number.ONE, annotationValue = @Annotation2, stringArrayValue = {"tom", "jerry"}) public class Student { }
1
2
3
4
5
6
7
Target 注解中 , ElementType[] value() 注解屬性的類型是數(shù)組類型 , 說明可以設(shè)置多個 注解 標(biāo)注 位置 ;
如 : 使用如下
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
1
元注解修飾 Annotation 注解 , 則可以同時在 類 , 字段 和 方法上使用該 Annotation 注解 ;
四、@Retention 元注解
@Retention 注解用于說明該注解需要保留到什么階段 ;
Java 代碼的三個階段分別是 :
源代碼階段 ,
類對象階段 ,
運行時階段 ;
查看 Retention 源碼 ,
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Retention { RetentionPolicy value(); }
1
2
3
4
5
6
Retention 注解的 注解屬性 RetentionPolicy value() , 其類型是 RetentionPolicy 枚舉類型 , 三個枚舉值 , 分別對應(yīng) Java 代碼三大階段
源代碼階段 ,
類對象階段 ,
運行時階段 ;
public enum RetentionPolicy { /** * 源代碼階段 * 編譯器丟棄該注解. */ SOURCE, /** * 類對象階段 * 注解會被保存到字節(jié)碼文件中, 不會被 JVM 讀取到. */ CLASS, /** * 運行時階段 * 注解會被保存到字節(jié)碼文件中, 并會被 JVM 讀取到. * * @see java.lang.reflect.AnnotatedElement */ RUNTIME }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
一般情況下 , 開發(fā)則自定義注解 , 都是在運行時進行一些代碼分析 , 設(shè)置 RetentionPolicy.RUNTIME 注解屬性 ;
@Retention(RetentionPolicy.RUNTIME)
1
五、@Documented 元注解
如果添加了該注解 , 表示當(dāng)前注解會被抽取到 Java API 文檔中 ;
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Documented { }
1
2
3
4
5
使用 javadoc Student.java 命令 , 生成 Java 文檔 ; 如果使用 @Documented 注解修飾 Annotation 注解 , 則導(dǎo)出的文檔如下 , 在類和方法的上面會顯示相應(yīng)注解 ;
如果不使用 @Documented 注解 , 則生成的文檔中沒有 Annotation 注解 ;
六、@Documented 元注解
@Inherited : 描述 注解
是否被子類繼承
, 如果添加了該注解 , 則子類會自動繼承父類的注解 ;
使用
@Inherited
元注解 標(biāo)注
Annotation 注解 ;
使用 Annotation 注解
標(biāo)注父類 Person ;
子類 Student 繼承 Person 類
,
子類中不添加注解 ,
那么父類 Person 中的注解自動添加給子類 Student ;
Java
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。