JDK 5 提供四大元註解:@Retention、@Target、@Inherited、@Documented。本文聚焦後三者差異與用法。
@Documented @Retention(RUNTIME) @Target(ANNOTATION_TYPE)
public @interface Target { ElementType[] value(); }
單屬性 value,類型為 ElementType[]。ElementType 枚舉八值:
TYPE:類、接口、枚舉、註解類型FIELD:字段(含枚舉常量)METHOD:方法PARAMETER:參數CONSTRUCTOR:構造器LOCAL_VARIABLE:局部變量ANNOTATION_TYPE:註解類型PACKAGE:包(用於 package-info.java)若註解聲明無 @Target,則可用於任意元素;有則編譯器強制限制。
@Documented @Retention(RUNTIME) @Target(ANNOTATION_TYPE)
public @interface Documented {}
標記該元註解的註解,在生成 Javadoc 時會被包含在文檔中;否則 Javadoc 忽略該註解信息。
@Documented @Retention(RUNTIME) @Target(ANNOTATION_TYPE)
public @interface Inherited {}
默認情況下,子類不會繼承父類的註解。標記 @Inherited 後,子類可繼承父類被該註解修飾的註解(僅限類級註解,且父類被標記的註解必須有 @Inherited)。
| 元註解 | 核心作用 | 作用目標 | 默認行為 |
|---|---|---|---|
@Target | 限制註解可修飾的程序元素類型 | 自定義註解類型 | 無限制(任意元素) |
@Documented | 決定註解信息是否出現在 Javadoc 中 | 自定義註解類型 | 不出現 |
@Inherited | 決定註解是否被子類繼承 | 自定義註解類型(類級) | 不繼承 |
@Target,明確使用場景,避免濫用。@Documented。@Entity、@Component)時加 @Inherited。