第二十三章 註解
定義在 java.lang
包中的5種標準註解:java
@Override
:表示當前的方法定義將覆蓋基類的方法。若是你不當心拼寫錯誤,或者方法簽名被錯誤拼寫的時候,編譯器就會發出錯誤提示。@Deprecated
:若是使用該註解的元素被調用,編譯器就會發出警告信息。@SuppressWarnings
:關閉不當的編譯器警告信息。@SafeVarargs
:在 Java 7 中加入用於禁止對具備泛型varargs參數的方法或構造函數的調用方發出警告。@FunctionalInterface
:Java 8 中加入用於表示類型聲明爲函數式接口
基本語法
從語法的角度上看,註解的使用方式和修飾符的使用方式一致。數組
定義註解
@Target
定義你的註解能夠應用在哪裏(例如是方法仍是字段)。@Retention
定義了註解在哪裏可用,在源代碼中(SOURCE),class文件(CLASS)中或者是在運行時(RUNTIME)。ide
不包含任何元素的註解稱爲標記註解(marker annotation)。函數
元註解
Java 語言中目前有 5 種標準註解,以及 5 種元註解。工具
元註解用於註解其餘的註解:spa
註解 | 解釋 |
---|---|
@Target |
表示註解能夠用於哪些地方。可能的ElementType 參數包括:CONSTRUCTOR :構造器的聲明FIELD :字段聲明(包括 enum 實例)LOCAL_VARIABLE :局部變量聲明METHOD :方法聲明PACKAGE :包聲明PARAMETER :參數聲明TYPE :類、接口(包括註解類型)或者 enum 聲明 |
@Retention |
表示註解信息保存的時長。可選的RetentionPolicy 參數包括:SOURCE :註解將被編譯器丟棄CLASS :註解在 class 文件中可用,可是會被 VM 丟棄。RUNTIME :VM 將在運行期也保留註解,所以能夠經過反射機制讀取註解的信息。 |
@Documented |
將此註解保存在 Javadoc 中 |
@Interited |
容許子類繼承父類的註解 |
@Repeatable |
容許一個註解能夠被使用一次或者屢次(Java 8)。 |
編寫註解處理器
使用註解中一個很重要的部分就是,建立與使用註解處理器。Java 拓展了反射機制的 API 用於幫助你創造這類工具。同時他還提供了 javac 編譯器鉤子在編譯時使用註解。code
註解元素
註解元素可用的類型以下所示:繼承
- 全部基本類型(int、float、boolean等)
- String
- Class
- enum
- Annotation
- 以上類型的數組
默認值限制
元素要麼有默認值,要麼就在使用註解時提供元素的值。接口
這裏有另一個限制:任何非基本類型的元素, 不管是在源代碼聲明時仍是在註解接口中定義默認值時,都不能使用 null 做爲其值。get
生成外部文件
在 @Target
註解中指定的每個 ElementType 就是一個約束,它告訴編譯器,這個自定義的註解只能用於指定的類型。你能夠指定 enum ElementType
中的一個值,或者以逗號分割的形式指定多個值。若是想要將註解應用於全部的 ElementType,那麼能夠省去 @Target 註解,可是這並不常見。
快捷方式特性:若是你在註解中定義了名爲 value
的元素,而且在使用該註解時,value 爲惟一一個須要賦值的元素,你就不須要使用名—值對的語法,你只須要在括號中給出 value 元素的值便可。這能夠應用於任何合法類型的元素。這也限制了你必須將元素命名爲 value.
替代方案
在 Java 8,在使用多個註解的時候,你能夠重複使用同一個註解。