Java 5 提供 4 標準元註解(均在 java.lang.annotation 包):
| 元註解 | 作用 | 關鍵屬性值 |
|---|---|---|
@Target | 限制註解可用位置 | ElementType 枚舉:TYPE、FIELD、METHOD、PARAMETER、CONSTRUCTOR、LOCAL_VARIABLE、PACKAGE |
@Retention | 定義註解生命周期 | RetentionPolicy:SOURCE(源碼)、CLASS(字節碼,默認)、RUNTIME(運行時,可反射獲取) |
@Documented | 標記註解應被 javadoc 文檔化 | 無屬性,標記註解 |
@Inherited | 允許子類繼承父類的此註解 | 無屬性,僅對類級別註解有效 |
// 僅可用於類、接口、枚舉聲明
@Target(ElementType.TYPE)
public @interface Table {
String tableName() default "className";
}
// 僅可用於字段
@Target(ElementType.FIELD)
public @interface NoDBColumn { }
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME) // 運行時可反射讀取
public @interface Column {
String name() default "fieldName";
String setFuncName() default "setField";
String getFuncName() default "getField";
boolean defaultDBValue() default false;
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented // 將出現在生成的 Javadoc 中
public @interface Column { ... }
// 父類註解可被子類繼承(需配合 RUNTIME 保留)
@Inherited
public @interface Greeting {
String name();
FontColor fontColor() default FontColor.GREEN;
enum FontColor { BLUE, RED, GREEN }
}
public @interface AnnotationName {
// 參數聲明:無參方法,返回值即參數類型
// 支持類型:基本類型、String、Class、enum、Annotation、以上類型的數組
Type paramName() default defaultValue;
}
public 或默認(package-private)value(),使用時可省略參數名:@Annotation("val")null 為默認值,慣用空字符串 "" 或 -1 表示「未指定」@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitName {
String value() default "";
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitColor {
enum Color { BLUE, RED, GREEN }
Color fruitColor() default Color.GREEN;
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitProvider {
int id() default -1;
String name() default "";
String address() default "";
}
public class Apple {
@FruitName("Apple")
private String appleName;
@FruitColor(fruitColor = Color.RED)
private String appleColor;
@FruitProvider(id = 1, name = "果園有限公司", address = "北京市")
private String provider;
// getter/setter 省略
}
定義註解只是第一步,核心價值在於註解處理器通過反射讀取註解信息並執行邏輯(如 ORM 映射、參數驗證、代碼生成)。下一步學習:AnnotationProcessor、運行時反射解析、編譯時處理(APT)。