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 @interface Target { 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 @interface Table { /** * 數據表名稱注解,默認值為類名稱 * @return */ public String tableName() default "className"; } @Target(ElementType.FIELD) public @interface NoDBColumn { }
那么到這里,我們的@Target 元注解解釋完畢,有不明白地方, @企鵝:2783309477
@Retention注解:
@Retention 精簡解釋:
就是對自定義注解的生命周期的管理。
@Retention 詳細解釋:
@Retention定義了該Annotation被保留的時間長短:某些Annotation僅出現在源代碼中,而 被編譯器丟棄;而另一些卻被編譯在class文件中;編譯在class文件中的Annotation可能會被虛擬機忽略,而另一些在class被裝載時將 被讀取(請注意並不影響class的執行,因為Annotation與class在使用上是被分離的)。使用這個meta-Annotation可以對 Annotation的“生命周期”限制
——————————————————————————————
@Retention: 定義注解的保留策略
——————————————————————————————
@Retention java源碼:
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Retention { RetentionPolicy value(); }
通過源代碼可以看到RetentionPolicy可取值。那么接下來
———————————————————————————————
@Retention 取值:
RetentionPolicy可取值:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在運行時有效(即運行時保留)
@Retention 實例:
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Column { 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字節碼文件中存在,但運行時無法獲得,
OK,這個就解釋到這里,有不明白 @小企鵝:2783309477(如是),接下來
@Documented 元注解:
@Documented用於描述其它類型的annotation應該被作為被標注的程序成員的公共API,
因此可以被例如javadoc此類的工具文檔化。
Documented是一個標記注解,沒有成員。
@Document java源碼:
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Documented { }
@Document 實例:
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Column { public String name() default "fieldName"; public String setFuncName() default "setField"; public String getFuncName() default "getField"; public boolean defaultDBValue() default false; }