JAVA_基礎註解的概念

什麼是註解

Annotation 其實就是代碼裏的特殊標記, 這些標記能夠在編譯, 類加 載, 運行時被讀取, 並執行相應的處理。經過使用 Annotation, 程序員 能夠在不改變原有邏輯的狀況下, 在源文件中嵌入一些補充信息。代 碼分析工具、開發工具和部署工具能夠經過這些補充信息進行驗證 或者進行部署。
Annotation 能夠像修飾符同樣被使用, 可用於修飾包,類, 構造器, 方 法, 成員變量, 參數, 局部變量的聲明, 這些信息被保存在 Annotation 的 name=value 對中。java

1)使用 Annotation 時要在其前面增長 @ 符號, 並把該 Annotation 當成 一個修飾符使用。用於修飾它支持的程序元素
示例一:生成文檔相關的註解
@author 標明開發該類模塊的做者,多個做者之間使用,分割 。
@version 標明該類模塊的版本 。
@see 參考轉向,也就是相關主題 。
@since 從哪一個版本開始增長的 。
@param 對方法中某參數的說明,若是沒有參數就不能寫 。
@return 對方法返回值的說明,若是方法的返回值類型是void就不能寫 。
@exception 對方法可能拋出的異常進行說明 ,若是方法沒有用throws顯式拋出的異常就不能寫 其中。
@param @return@exception 這三個標記都是隻用於方法的。
@param的格式要求:@param 形參名 形參類型 形參說明 。
@return 的格式要求:@return 返回值類型 返回值說明 。
@exception的格式要求:@exception 異常類型 異常說明 。
@param@exception能夠並列多個。程序員

示例二:在編譯時進行格式檢查(JDK內置的三個基本註解)ide

@Override: 限定重寫父類方法, 該註解只能用於方法 。
@Deprecated: 用於表示所修飾的元素(類, 方法等)已過期。一般是由於 所修飾的結構危險或存在更好的選擇。
@SuppressWarnings: 抑制編譯器警告。工具

自定義註解

① 註解聲明爲:@interface
② 內部定義成員,一般使用value表示。
③ 能夠指定成員的默認值,使用defaulat定義。
④ 若是自定義註解沒有成員,代表是一個標識做用。開發工具

若是註解有成員,在使用註解時,須要指明成員的值。
定義註解必須配上註解的信息處理流程(使用反射)纔有意義。
自定義註解經過都會指明兩個元註解:Retention Targetcode

public @interface MyAnnotation {
    String value() default "hello";
}

@MyAnnotation(value = "holle")
class Person{
    @MyAnnotation()
    public void show(){
        ....
    }
    ....
}

JDK 提供的元註解

元註解:對現有的註解進行解釋說明的註解繼承

  • JDK 的元 Annotation 用於修飾其餘 Annotation 定義。
  • JDK5.0提供了4個標準的meta-annotation類型,分別是:
    Retention :指定所修飾的Annotation的生命週期:SOURCE\CLASS(默認行爲)\RUNTIME只能聲明爲RUNTIME生命週期的註解,才能經過反射獲取。
    Target :用於修飾 Annotation 定義, 用於指定被修飾的 Annotation 能用於 修飾哪些程序元素。 @Target 也包含一個名爲 value 的成員變量。
    Documented :表示所別修飾的註解在被Javadoc解析時,保留下來。
    Inherited:被它修飾的 Annotation 將具備繼承性。若是某個類使用了被 @Inherited 修飾的 Annotation, 則其子類將自動具備該註解。

經過反射獲取註解信息

JDK8 中註解的新特性:可重複註解、類型註解

  • 可重複註解生命週期

    ① 在MyAnnotation上聲明@Repeatable,成員值爲MyAnnotations.class
    MyAnnotationTargetRetention等元註解與MyAnnotations相同。開發

//JDK8以前的寫法
@MyAnnotations({@MyAnnotation(value = "hi"),@MyAnnotation(value = "hello")})
class Person{
    ....
}
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ TYPE,FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
public @interface MyAnnotation {
    String value() default "hello";
}
public @interface MyAnnotations {
    MyAnnotation[] value();
}
//JDK8的寫法
@MyAnnotation(value = "hi")
@MyAnnotation(value = "hello")
class Person{
    ....
}
@Inherited
@Repeatable(MyAnnotations.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ TYPE,FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
public @interface MyAnnotation {
    String value() default "hello";
}
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ TYPE,FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
public @interface MyAnnotations {
    MyAnnotation[] value();
}

類型註解

JDK1.8以後,關於元註解@Target的參數類型ElementType枚舉值多了兩個TYPE_PARAMETER,TYPE_USE文檔

ElementType.TYPE_PARAMETER 表示該註解能寫在類型變量的聲明語 句中(如:泛型聲明)。
ElementType.TYPE_USE 表示該註解能寫在使用類型的任何語句中。

@Target(TYPE_PARAMETER)
public @interface MyAnnotation {
    String value() default "hello";
}
class Generic<@MyAnnotation(value = "我是TYPE_PARAMETER`註解") T>{
}
@Target({TYPE_USE})
public @interface MyAnnotation {
    String value() default "hello";
}
class Generic<T>{
    public void show() throws @MyAnnotation RuntimeException {
        ArrayList<@MyAnnotation(value = "我是TYPE_USE註解") String> list = new ArrayList<>();
        int num = (@MyAnnotation int) 10L;
    }
}
相關文章
相關標籤/搜索