Java 注解介紹

qvuy6712 7年前發布 | 11K 次閱讀 Java 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
  }
  1. @interface表示該類是一個注解,并實現了 Annotation接口 。

  2. @Target表示該注解可以修飾的類型;如果不填,則此注解可以使用任何元素之上;

  3. @Retention用來定義注解在哪一個級別可用,是源碼中可見、編譯器可見還是VM可見;如果不填,默認級別是CLASS。

  4. 注解元素可用的類型

    所有基本類型(int,float,boolean,byte,double,char,long,short)、 String、Class、enum、Annotation和以上類型的數組;其它的值都會拋出 Error: 注釋值不是允許的類型 。

  5. 注解的快捷方式

    當注解內元素方法名為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處理注解有兩種方式:

  1. 使用apt來在編譯時期生成相應的代碼,通過注解處理器(AnnotationProcessor)來處理

  2. 在運行時通過反射獲取注解信息來處理

這塊之后專門來學習,這篇文章不贅述了。

6. 注解的作用

  1. 生成文檔。這是最常見的,也是java 最早提供的注解。常用的有@see @param @return 等

  2. 代碼分析,跟蹤代碼依賴性。如JUnit框架的注解使用。

  3. 在編譯時進行格式檢查。如@override 放在方法前,如果你這個方法并不是覆蓋了超類方法,則編譯時就能檢查出。

結語

本篇文章介紹注解的基本概念和作用,對注解的基本有個清晰的了解,之后再單獨寫對注解的處理。

參考:

Java Annotation認知(包括框架圖、詳細介紹、示例說明)

Java注解全面解析

Java深度歷險(六)——Java注解

 

來自:https://juejin.im/post/58cabc0e44d9040069f39fd7

 

 本文由用戶 qvuy6712 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!