JAVA 元註解 @Target @Retention @Documented @Inherited

愛吃肉肉的唐僧吶發表於2020-10-26
JAVA 元註解 @Target @Retention @Documented @Inherited
一、元註解

JDK1.5起提供了四個元註解,即@Target,@Retention,@Document,@Inherited。所謂的元註解就是註解的註解的意思,如果我們在開發過程中需要自定義註解以滿足需求,我們自定義的註解就需要被元註解修飾,比如我們新自定義CreateAnnotation註解

@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface CreateAnnotation {

}
1. @Target
// 單引數
@Target({ ElementType.METHOD })
// 多引數
@Target(value = {ElementType.METHOD,ElementType.TYPE})

@Target註解用於定義註解的使用位置,如果沒有該註解,表示註解可以用於任何地方
@Target的ElementType取值有以下型別:

  • TYPE:類,介面或者列舉
  • FIELD:域,包含列舉常量
  • METHOD:方法
  • PARAMETER:引數
  • CONSTRUCTOR:構造方法
  • LOCAL_VARIABLE:區域性變數
  • ANNOTATION_TYPE:註解型別
  • PACKAGE:包
2. @Retention

@Retention註解用於指明修飾的註解的生存週期,即會保留到哪個階段。格式為:

@Retention(RetentionPolicy.RUNTIME)

RetentionPolicy的取值包含以下三種:

  • SOURCE:原始碼級別保留,編譯後即丟棄。
  • CLASS:編譯級別保留,編譯後的class檔案中存在,在jvm執行時丟棄,這是預設值。
  • RUNTIME:執行級別保留,編譯後的class檔案中存在,在jvm執行時保留,可以被反射呼叫。
3. @Documented

指明修飾的註解,可以被例如javadoc此類的工具文件化,只負責標記,沒有成員取值。

4. @Inherited

@Inherited註解用於標註一個父類的註解是否可以被子類繼承,如果一個註解需要被其子類所繼承,則在宣告時直接使用@Inherited註解即可。如果沒有寫此註解,則無法被子類繼承。下面做一個測試:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
//如果父類使用了InHeritedApplication註解,則子類應該繼承
@Inherited
@interface InHeritedApplication {
}
 
//父類使用了@InHeritedApplication註解
@InHeritedApplication
class Animal {
 
}

class Dog extends Animal{
 
}

則 Student類也有@HeritedApplication

相關文章