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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

标记注解 java_【java】细说 JAVA中 标注 注解(annotation)

發布時間:2024/2/28 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 标记注解 java_【java】细说 JAVA中 标注 注解(annotation) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java注解是附加在代碼中的一些元信息,用于一些工具在編譯、運行時進行解析和使用,起到說明、配置的功能。

注解不會也不能影響代碼的實際邏輯,僅僅起到輔助性的作用

下面我們來詳細說說這個注解,到底是怎么一回事,一步一步看下去,總會后收獲。

注解起源:Annotation(注解)是JDK5.0及以后版本引入的。在java.lang.annotation包中。

注解作用:它可以用于創建文檔,跟蹤代碼中的依賴性,甚至執行基本編譯時檢查。

注解格式:注解是以‘@注解名’在代碼中存在的

注解分類:標記注解、單值注解、完整注解三類

另外:它都不會直接影響到程序的語義,只是作為注解(標識)存在,我們可以通過反射機制編程實現對這些元數據的訪問。

元注解說,我先來上陣-----

------------------------------main-----------------------------------

一、元注解:

元注解功能:就是對其他注解進行注解。

我們它的功能劃分為三類:

編寫文檔:通過代碼里標識的元數據生成文檔;

代碼分析:通過代碼里標識的元數據對代碼進行分析;

編譯檢查:通過代碼里標識的元數據讓編譯器能實現基本的編譯檢查。

元注解包括:@Retention @Target @Document @Inherited四種。

@Target 注解:

---------------------------------------------------

@Target解釋:

@Target說明了Annotation所修飾的對象范圍:

Annotation可被用于 packages、types(類、接口、枚舉、Annotation類型)、類型成員(方法、構造方法、成員變量、枚舉值)、方法參數和本地變量(如循 環變量、catch參數)。

在Annotation類型的聲明中使用了target可更加明晰其修飾的目標。

@Target作用:用于描述注解的使用范圍(即:被描述的注解可以用在什么地方)

@Target 的java源碼:

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.ANNOTATION_TYPE)public @interfaceTarget {

ElementType[] value();

}

備注:先解釋一下 interface 表示接口,而@interface表示annotation

——————————————————————————

ElementType取值:

通過源碼可以看到,ElementType ,它的取值有:

1.CONSTRUCTOR:用于描述構造器

2.FIELD:用于描述域

3.LOCAL_VARIABLE:用于描述局部變量

4.METHOD:用于描述方法

5.PACKAGE:用于描述包

6.PARAMETER:用于描述參數

7.TYPE:用于描述類、接口(包括注解類型) 或enum聲明

------------------------------------------------

實例: (我們自定義了兩個自定義注解,按照上面我們給出的取值含義,@table將會用于類、接口或enum聲明)

@Target(ElementType.TYPE)public @interfaceTable {/*** 數據表名稱注解,默認值為類名稱

*@return

*/

public String tableName() default "className";

}

@Target(ElementType.FIELD)public @interfaceNoDBColumn {

}

那么到這里,我們的@Target 元注解解釋完畢,有不明白地方, @企鵝:2783309477

@Retention注解:

@Retention 精簡解釋:

就是對自定義注解的生命周期的管理。

@Retention 詳細解釋:

@Retention定義了該Annotation被保留的時間長短:某些Annotation僅出現在源代碼中,而 被編譯器丟棄;而另一些卻被編譯在class文件中;編譯在class文件中的Annotation可能會被虛擬機忽略,而另一些在class被裝載時將 被讀取(請注意并不影響class的執行,因為Annotation與class在使用上是被分離的)。使用這個meta-Annotation可以對 Annotation的“生命周期”限制

——————————————————————————————

@Retention: 定義注解的保留策略

@Retention(RetentionPolicy.SOURCE)???//注解僅存在于源碼中,在class字節碼文件中不包含

@Retention(RetentionPolicy.CLASS)// 默認的保留策略,注解會在class字節碼文件中存在,但運行時無法獲得

@Retention(RetentionPolicy.RUNTIME)??// 注解會在class字節碼文件中存在,在運行時可以通過反射獲取到

——————————————————————————————

@Retention java源碼:

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.ANNOTATION_TYPE)public @interfaceRetention {

RetentionPolicy value();

}

通過源代碼可以看到RetentionPolicy可取值。那么接下來

———————————————————————————————

@Retention? 取值:

RetentionPolicy可取值:

1.SOURCE:在源文件中有效(即源文件保留)

2.CLASS:在class文件中有效(即class保留)

3.RUNTIME:在運行時有效(即運行時保留)

@Retention 實例:

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)public @interfaceColumn {public String name() default "fieldName";public String setFuncName() default "setField";public String getFuncName() default "getField";public boolean defaultDBValue() default false;

}

備注:也同樣,可以看出來,Column將會有在運行時有效范圍。

一般格式:

@Retention(RetentionPolicy.SOURCE)???//注解僅存在于源碼中,在class字節碼文件中不包含

@Retention(RetentionPolicy.CLASS)// 默認的保留策略,注解會在class字節碼文件中存在,但運行時無法獲得,

@Retention(RetentionPolicy.RUNTIME)??// 注解會在class字節碼文件中存在,在運行時可以通過反射獲取到

OK,這個就解釋到這里,有不明白 @小企鵝:2783309477(如是),接下來

@Documented 元注解:

@Documented用于描述其它類型的annotation應該被作為被標注的程序成員的公共API,

因此可以被例如javadoc此類的工具文檔化。

Documented是一個標記注解,沒有成員。

@Document java源碼:

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.ANNOTATION_TYPE)public @interfaceDocumented {

}

@Document 實例:

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

@Documentedpublic @interfaceColumn {public String name() default "fieldName";public String setFuncName() default "setField";public String getFuncName() default "getField";public boolean defaultDBValue() default false;

}

@Inherited 元注解:

@Inherited 解釋:

是一個標記注解,@Inherited闡述了某個被標注的類型是被繼承的。

也就是說,如果被它修飾的annotation類型用在一個類上面,這個annotation 將被用在子類中。

注意:

1、@Inherited annotation類型是被標注過的class的子類所繼承。

類并不從它所實現的接口繼承annotation,方法并不從它所重載的方法繼承annotation。

2、當@Inherited annotation類型標注的annotation的Retention是RetentionPolicy.RUNTIME,

則反射API增強了這種繼 承性。如果我們使用java.lang.reflect去查詢一個@Inherited annotation

類型的annotation時,反射代碼檢查將展開工作:檢查class和其父類,直到發現指定的annotation類型

被發現, 或者到達類繼承結構的頂層。

未完待續(自定義注解/默認注解/...)

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的标记注解 java_【java】细说 JAVA中 标注 注解(annotation)的全部內容,希望文章能夠幫你解決所遇到的問題。

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