Java 註解介紹

前言

Java註解介紹javascript

1. 註解中最重要的三個類

AnnotationElementTypeRetentionPolicy這三個類是註解中最重要的類,沒有這三個類就沒有註解,其中Annotation是接口,其他兩個是枚舉。
全部的註解都基於這三個類,所謂的元註解也是用這三個類生成的,只不過可修飾的元素(ElementType)爲ANNOTATION_TYPE罷了,你也能夠寫個元註解。html

1. Annotationjava

package java.lang.annotation; //java.lang.annotation包下
public interface Annotation {
    boolean equals(Object var1);

    int hashCode();

    String toString();

    Class<? extends Annotation> annotationType();
}複製代碼

2. ElementTypeapi

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() {
    }
}複製代碼

3. RetentionPolicy數組

package java.lang.annotation;//java.lang.annotation包下
public enum RetentionPolicy {
    SOURCE,  //註解將被編譯器丟棄;Annotation信息僅存在於編譯器處理期間,編譯器處理完以後就沒有該Annotation信息了
    CLASS,  //註解在class文件中可用,但會被VM丟棄
    RUNTIME;  //VM將在運行期也保留註解信息,所以能夠經過反射機制讀取註解的信息

    private RetentionPolicy() {
    }
}複製代碼

2. 四種元註解

Java提供了四種元註解(meta-annotation),元註解就是專職負責註解其餘的註解,因此這四種註解的Target值都是ElementType.ANNOTATION_TYPE框架

1. @Target
表示該註解能夠用在什麼地方,由ElementType枚舉定義ide

@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文檔中ui

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Documented {
}複製代碼

4. @Inherited
容許子類繼承父類的註解,即它所標註的Annotation將具備繼承性spa

@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 放在方法前,若是你這個方法並非覆蓋了超類方法,則編譯時就能檢查出。

結語

本篇文章介紹註解的基本概念和做用,對註解的基本有個清晰的瞭解,以後再單獨寫對註解的處理,ButterKnife是個很好的學習例子。



參考:
Java Annotation認知(包括框架圖、詳細介紹、示例說明)
Java註解全面解析
Java深度歷險(六)——Java註解

相關文章
相關標籤/搜索