隨著 Spring 3.0、Struts2 等框架廣泛採用註解,掌握 JDK 5 Annotation 核心元註解至關重要。本文聚焦 @Target,解析其限制作用及 ElementType 枚舉詳情。
java.lang.annotation.Target 用於指定註解的適用範圍,即註解可修飾的程序元素類型。若註解類型聲明中缺少 @Target,則該註解可用於任意程序元素;若存在,編譯器將強制限制其使用位置。
| 枚舉值 | 適用範圍 |
|---|---|
| METHOD | 方法聲明 |
| TYPE | 類、接口(含註解類型)、枚舉聲明 |
| ANNOTATION_TYPE | 註解類型聲明(被 @interface 修飾的類型) |
| CONSTRUCTOR | 構造方法聲明 |
| FIELD | 字段聲明(含枚舉常量) |
| LOCAL_VARIABLE | 局部變量聲明 |
| PACKAGE | 包聲明(用於 package-info.java) |
| PARAMETER | 參數聲明 |
ElementType.PACKAGE 不用於普通類,而是用於固定文件 package-info.java。文件名必須為 package-info,因非合法類文件,Eclipse 新建類會報錯,需以新建文件方式創建。
@Target({ElementType.PACKAGE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface AsynLog { }
@AsynLog package org.my.commons.logs.annotation;
註解只能在 @Target 指定範圍內使用,否則編譯報錯。例如:
@Target({ElementType.METHOD})
public @interface MyAnno { }
若嘗試在類或字段上使用 @MyAnno,編譯器將報錯:「Annotation type not applicable to this kind of declaration」。
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface AsynLog { }
該註解僅能修飾方法,運行時保留,可繼承,納入 Javadoc。
@Target 是註解設計的「守門人」,精確控制註解使用位置,避免濫用。結合 ElementType 八大枚舉值,覆蓋 Java 程序元素全維度。實戰中務必根據業務場景合理設置,發揮編譯期約束優勢。