Java 注解介紹
前言
Java注解介紹
1. 注解中最重要的三個類
Annotation 、 ElementType 、 RetentionPolicy 這三個類是注解中最重要的類, 沒有這三個類就沒有注解 ,其中 Annotation 是接口,其余兩個是枚舉。
所有的注解都基于這三個類,所謂的 元注解 也是用這三個類生成的,只不過可修飾的元素(ElementType)為ANNOTATION_TYPE罷了,你也可以寫個元注解。
1. Annotation
package java.lang.annotation; //java.lang.annotation包下
public interface Annotation {
boolean equals(Object var1);
int hashCode();
String toString();
Class<? extends Annotation> annotationType();
}</code></pre>
2. ElementType
package java.lang.annotation; //java.lang.annotation包下
public enum ElementType {
TYPE, // 類、接口(包括注釋類型)或枚舉聲明
FIELD, // 字段聲明(包括枚舉常量)
METHOD, //方法聲明
PARAMETER, //參數聲明
CONSTRUCTOR, //構造方法聲明
LOCAL_VARIABLE, //局部變量聲明
ANNOTATION_TYPE, //注解類型聲明
PACKAGE, //包聲明
TYPE_PARAMETER, //類型參數聲明(1.8新加入),表示這個注解可以用來標注類型參數
TYPE_USE; //類型使用聲明(1.8新加入),用于標注各種類型,只要是類型名稱,都可以進行注解
private ElementType() {
}
}</code></pre>
3. RetentionPolicy
package java.lang.annotation;//java.lang.annotation包下
public enum RetentionPolicy {
SOURCE, //注解將被編譯器丟棄;Annotation信息僅存在于編譯器處理期間,編譯器處理完之后就沒有該Annotation信息了
CLASS, //注解在class文件中可用,但會被VM丟棄
RUNTIME; //VM將在運行期也保留注解信息,因此可以通過反射機制讀取注解的信息
private RetentionPolicy() {
}
}</code></pre>
2. 四種元注解
Java提供了四種元注解(meta-annotation),元注解就是專職負責注解其他的注解,所以這四種注解的Target值都是ElementType.ANNOTATION_TYPE
1. @Target
表示該注解可以用在什么地方,由ElementType枚舉定義
@Documented
@Retention(RetentionPolicy.RUNTIME) //被VM識別
@Target({ElementType.ANNOTATION_TYPE}) //修飾注解類型
public @interface Target {
ElementType[] value(); //當使用此注解時,無默認注解,必須要傳入ElementType
}
2. @Retention
表示需要在什么級別保存該注解信息,由RetentionPolicy枚舉定義
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Retention {
RetentionPolicy value(); // 必須要傳入
}
3. @Documented
表示注解會被包含在javaapi文檔中
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Documented {
}
4. @Inherited
允許子類繼承父類的注解,即它所標注的Annotation將具有繼承性
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Inherited {
}
3. 注解的基本語法
//@Target(ElementType.Method)
//@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
int id(); // default 1; 不添加default值使用該注解時必須要傳入傳入
String value() default ""; //如果只有value()這一個屬性需要賦值的話,可以省略鍵值對傳值
// Integer id() default 1; //拋出異常,Invalid type
}
-
@interface表示該類是一個注解,并實現了 Annotation接口 。
-
@Target表示該注解可以修飾的類型;如果不填,則此注解可以使用任何元素之上;
-
@Retention用來定義注解在哪一個級別可用,是源碼中可見、編譯器可見還是VM可見;如果不填,默認級別是CLASS。
-
注解元素可用的類型
所有基本類型(int,float,boolean,byte,double,char,long,short)、 String、Class、enum、Annotation和以上類型的數組;其它的值都會拋出 Error: 注釋值不是允許的類型 。
-
注解的快捷方式
當注解內元素方法名為value()時, 并且該元素是唯一一個需要賦值的值 (另外的值有默認值),可以不用使用鍵值對來傳值,直接使用 @MyAnnotation("2") 傳值;如果有兩個,則要使用 @MyAnnotation(id=1,value = "2") 來傳值。
4. Java常用的注解
1. @Deprecated
所標注內容,不再被建議使用。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.LOCAL_VARIABLE, ElementType.METHOD, ElementType.PACKAGE, ElementType.PARAMETER, ElementType.TYPE})
public @interface Deprecated {
}
2. @Override
只能標注方法,表示該方法覆蓋父類中的方法。
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
3. @SuppressWarnings
所標注內容產生的警告,編譯器會對這些警告保持靜默。
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.CONSTRUCTOR, ElementType.LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
/*
value可取的值:
deprecation -- 使用了不贊成使用的類或方法時的警告
unchecked -- 執行了未檢查的轉換時的警告,例如當使用集合時沒有用泛型 (Generics) 來指定集合保存的類型。
fallthrough -- 當 Switch 程序塊直接通往下一種情況而沒有 Break 時的警告。
path -- 在類路徑、源文件路徑等中有不存在的路徑時的警告。
serial -- 當在可序列化的類上缺少 serialVersionUID 定義時的警告。
finally -- 任何 finally 子句不能正常完成時的警告。
all -- 關于以上所有情況的警告。
*/
5. 處理注解
Java處理注解有兩種方式:
-
使用apt來在編譯時期生成相應的代碼,通過注解處理器(AnnotationProcessor)來處理
-
在運行時通過反射獲取注解信息來處理
這塊之后專門來學習,這篇文章不贅述了。
6. 注解的作用
-
生成文檔。這是最常見的,也是java 最早提供的注解。常用的有@see @param @return 等
-
代碼分析,跟蹤代碼依賴性。如JUnit框架的注解使用。
-
在編譯時進行格式檢查。如@override 放在方法前,如果你這個方法并不是覆蓋了超類方法,則編譯時就能檢查出。
結語
本篇文章介紹注解的基本概念和作用,對注解的基本有個清晰的了解,之后再單獨寫對注解的處理。
參考:
Java Annotation認知(包括框架圖、詳細介紹、示例說明)
來自:https://juejin.im/post/58cabc0e44d9040069f39fd7