一、簡介
【概述】
不是程式本身,不能改變程式的執行結果,也不會影響程式執行的效能。可以對程式作出解釋,但是區別於註釋,註解可以寫入引數,透過反射機制來獲取所註解資訊的訪問。
【分類】
根據註解是否包含成員變數,可以分為如下兩類。
分類 |
說明 |
標記註解 |
沒有定義成員變數,這種註解僅利用自身的存在與否來提供資訊 |
後設資料註解 |
包含成員變數,因為可以接受更多的後設資料,所以也被稱為後設資料註解。 |
【常見註解】
註解 |
作用域 |
說明 |
@Override |
方法 |
指定方法重寫,只能修飾方法。 |
@Deprecated |
類、介面、成員方法和成員變數 |
表示某個元素(類、方法等)已過時 |
@SuppressWarnings |
類、介面、成員方法 |
取消顯示指定的編譯器警告 |
@SafeVarargs |
可變引數方法 |
抑制編譯器警告 |
@FunctionalInterface |
介面 |
指定某個介面必須是函式式介面 |
二、元註解
用於解釋其他註解,自定義註解時可使用元註解。
1、@Documented
【概述】
標記註解,該註解修飾的註解類會被JavaDoc工具提取成文件。
【示例】
編寫註解和測試類
@Documented @Target({ ElementType.TYPE, ElementType.METHOD }) public @interface FxDocumented { String name() default "這是@Documented註解"; }
@FxDocumented(name = "fuxing") public class FuXing { /** * 測試document */ @FxDocumented(name = "fuxing") public String Test() { return "CodeUpHub測試@Documented"; } }
開啟Java檔案所在的目錄,分別輸入如下兩條命令列:
javac FuXing.java FxDocumented.java javadoc -d doc FuXing.java FxDocumented.java
執行成功後,開啟生成的幫助文件,如下圖
2、@Target
【概述】
用來指定一個註解的使用範圍,即被@Target修飾的註解可以用在什麼地方。該註解有一個成員變數(value)用來設定適用目標。
【作用域常量】
列舉 |
說明 |
CONSTRUCTOR |
用於構造方法 |
FIELD |
用於成員變數(包括列舉常量) |
LOCAL_VARIABLE |
用於區域性變數 |
METHOD |
用於方法 |
PACKAGE |
用於包 |
PARAMETER |
用於型別引數(JDK 1.8新增) |
TYPE |
用於類、介面(包括註解型別)或enum宣告 |
【示例】
@Documented @Target({ ElementType.TYPE, ElementType.METHOD }) //表明該註解作用於類和方法 public @interface FxDocumented { String name() default "這是@Documented註解"; }
3、@Retention
【概述】
用於描述註解的生命週期,也就是該註解被保留的時間長短。該註解中的成員變數(value)用來設定作用在哪個時期。
【作用域常量】
生命週期大小排序為 SOURCE < CLASS < RUNTIME
列舉 |
說明 |
SOURCE |
原始碼有效 |
CLASS |
CLASS類有效 |
RUNTIME |
執行時有效 |
4、@Inherited
【概述】
標記註解,用來指定該註解可以被繼承。使用該註解的Class類,表示這個註解可以被用於該Class類的子類。就是說如果某個類使用了被@Inherited修飾的註解,則其子類將自動具有該註解。
三、自定義註解
【流程】
建立註解類Annotation;
定義成員變數(以方法的形式來定義);
可以使用default為成員變數指定初始值;
【示例】
@Target({METHOD}) @Inherited @Retention(RUNTIME) public @interface FuXing { String name() default "FuXing"; }