java 註解 (Annotation) 和 四種元註解

註解概述

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

自定義註解

  1. 定義新的 Annotation 類型使用 @interface 關鍵字,自定義註解自動繼承了java.lang.annotation.Annotation
  2. Annotation 的成員變量:
    1. 無參數方法的形式來聲明。其方法名和返回值定義了該成員的名字和類型,我們稱爲配置參數.
    2. 類型只能是八種基本數據類型、String 類型 、Class 類型 、enum 類型 、Annotation 類型 、以上所有類型的數組
    3. 可以在定義 Annotation 的成員變量時爲其指定初始值, 指定成員變量的初始值可使用 default 關鍵字
    4. 如果只有一個參數成員,建議使用 參數名爲value
  3. 如果定義的註解含有配置參數,那麼使用時必須指定參數值,除非它有默認值。格式是“參數名 = 參數值”,如果只有一個參數成員,且名稱爲value,可以省略“value=”

代碼示例
註解定義:

@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    // 定義註解的成員變量,以無參的方法形式聲明,方法名和返回值定義了該成員的名字和類型
    // 並給該成員變量指定默認值
    String value() default "hello";
}

註解的使用:

//@MyAnnotation
//@MyAnnotation("hello2")
@MyAnnotation(value = "hello2")
public class AnnotationTest {
    
}

注意:註解要有實際意義的話,要看我們的實際業務場景,我們可以通過反射的方式獲取註解,並進行該註解的實際業務處理

通過反射獲取註解信息:

public class AnnotationTest02 {
    public static void main(String[] args) {
        Class<AnnotationTest> myAnnotationClass = AnnotationTest.class;
        Annotation[] annotations = myAnnotationClass.getAnnotations();
        for (Annotation annotation : annotations) {
            System.out.println("通過反射獲取MyAnnotation類上的註解:" + annotation);
        }
    }
}

運行結果:

通過反射獲取MyAnnotation類上的註解:@com.javastudy.annotation.MyAnnotation(value=hello2)

四種元註解

  • JDK 的元註解是用於修飾 註解的
  • JDK5.0提供了4個標準的meta-annotation類型,分別是:
    • Retention :表示註解的生命週期,在哪個階段有效
    • Target:表示註解用於飾哪些程序元素(如:類,方法,屬性)
    • Documented:註解 javadoc 工具提取成文檔
    • Inherited:註解可以被繼承,子類也擁有了註解

@Retention

  1. @Retention只能用於修飾一個 Annotation 定義(即用於修飾定義的註解), 用於指定該 Annotation 的生命週期
  2. @Rentention 包含一個 RetentionPolicy 類型的成員變量, 使用
    @Rentention 時必須爲該 value 成員變量指定值
    在這裏插入圖片描述
    在這裏插入圖片描述
  • RetentionPolicy.SOURCE:在源文件中有效(即源文件保留),編譯器直接丟棄這種策略的註釋
  • RetentionPolicy.CLASS:在class文件中有效(即class保留) , 當運行 Java 程序時, JVM不會保留註解。 這是默認值
  • RetentionPolicy.RUNTIME:在運行時有效(即運行時保留),當 當行 運行 Java 程序時, JVM 會 會保留註釋。程序 可以通過反射獲取 該註釋

在這裏插入圖片描述

代碼示例:
@Retention(value = RetentionPolicy.RUNTIME):表示在代碼運行時該註解有效

@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value() default "hello";
}

@Target

  1. @Target用於指定被修飾的 Annotation 能用於修飾哪些程序元素
  2. @Target 也包含一個名爲 value 的成員變量,value可以有以下取值:
    在這裏插入圖片描述

代碼示例:
@Target({ElementType.TYPE,ElementType.METHOD}):表示 MyAnnotation 這個註解可以修飾類,接口,和方法

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value() default "hello";
}

@Documented

  1. 用於指定被該元註解 修飾的 Annotation 類將被 javadoc 工具提取成文檔。默認情況下,javadoc是不包括註解的
  2. 定義爲Documented的註解必須設置Retention值爲RUNTIME

@Inherited

  1. 被它修飾的 Annotation 將具有 繼承性。如果某個類使用了被@Inherited 修飾的 Annotation, 則其子類將自動具有該註解
  2. 比如:如果把標有@Inherited註解的自定義的註解標註在類級別上,子類則可以繼承父類類級別的註解
  3. 實際應用中,使用較少
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章