註解是元資料,JDK 1.5 引入,不直接影響程式邏輯,但可被編譯器、工具、運行時反射讀取,用於:
@Override)| 註解 | 用途 |
|---|---|
@Override | 標示方法覆寫父類,編譯器檢查簽名一致性 |
@Deprecated | 標示過時 API,使用時編譯器警告 |
@SuppressWarnings | 抑制特定編譯器警告 |
元註解用於定義其他註解:
| 元註解 | 說明 | 關鍵屬性 |
|---|---|---|
@Target | 註解適用程式元素 | ElementType.TYPE/METHOD/FIELD/... |
@Retention | 註解保留階段 | RetentionPolicy.SOURCE/CLASS/RUNTIME |
@Documented | 包含於 JavaDoc | 無 |
@Inherited | 允許子類繼承父類註解 | 無 |
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MethodLog {
String method() default "do something";
String operator() default "someone";
}
@interface 宣告註解型別。default。public class CelebrateController {
@MethodLog(method = "celebrate birthday", operator = "we")
public void celebrateBirthday() {}
@MethodLog(operator = "we")
public void celebrateNewYears() {} // method 使用預設值
@MethodLog
public void yeah() {} // 全部預設值
}
public class MethodLogParse {
public static void parse(Class<?> clazz) {
for (Method m : clazz.getDeclaredMethods()) {
if (m.isAnnotationPresent(MethodLog.class)) {
MethodLog log = m.getAnnotation(MethodLog.class);
System.out.println(m.getName() + ": " + log.operator() + " - " + log.method());
}
}
}
public static void main(String[] args) { parse(CelebrateController.class); }
}
輸出:
celebrateBirthday: we - celebrate birthday
celebrateNewYears: we - do something
yeah: someone - do something
AbstractProcessor,配合 @Retention(SOURCE),掃描原始碼生成代碼(如 Lombok、MapStruct)。@Component、@RequestMapping 等建構 Bean 定義。@NotNull、@Size 搭配 Validator。註解是 Java 元程式設計的基石。掌握元註解語義、屬性設計與反射解析,即可打造類框架級的聲明式 API。