Java 5 引入的註解機制,已成為現代框架開發的基石。從 Spring 的依賴注入到 JUnit 的測試標記,註解無處不在。本文將從概念、原理、應用場景、標準註解到自定義實戰,為您全方位剖析這項關鍵特性。
註解是一種元資料,允許開發者將補充資訊(非業務邏輯)附加到程式元素(類、方法、欄位、參數等)上。它像修飾符一樣出現在宣告語句中,但不影響程式碼執行邏輯,而是供特定工具或框架在編譯期、載入期或執行期讀取並據此改變行為。
通俗理解:給程式碼貼上「標籤」,讓框架識別並自動完成配置、驗證、代碼生成等工作。
@interface 關鍵字隱含繼承 java.lang.annotation.Annotation 介面。Class、Method、Field 的 getAnnotation() 等)讀取。| 特性 | Annotation | Interface |
|---|---|---|
| 關鍵字 | @interface | interface |
| 方法限制 | 無參數、無拋出異常、回傳型別受限 | 無特殊限制 |
| 預設值 | 支援 default | 不支援 |
| 繼承 | 隱含繼承 Annotation 介面 | 可繼承多介面 |
| 泛型 | 成員不可為泛型 | 可定義泛型方法 |
註解廣泛應用於框架與工具中,根據註解資訊決定處理邏輯:
@Override、@SuppressWarnings。@Autowired、@Transactional;JUnit 的 @Test;Hibernate 的 @Entity。標記方法覆寫父類方法。若方法簽名與父類不符,編譯器報錯,防止拼寫錯誤導致「以為覆寫實則多載」。
標記過時 API。編譯器會對使用該元素的代碼發出警告。注意區別於 Javadoc 的 @deprecated 標籤(後者用於生成文檔說明替代方案)。
壓制編譯器警告。單一成員 value 為字串陣列,常用值:unchecked、fallthrough、deprecation 等。
// 完整寫法
@SuppressWarnings(value={"unchecked", "fallthrough"})
public void lintTrap() { ... }
// 單一值可簡寫
@SuppressWarnings("unchecked")
public void method() { ... }
以下示範定義 @Author、@Description 並透過反射解析。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface Author {
String name();
String group();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface Description {
String value();
}
關鍵元註解:
@Retention(RUNTIME):保留至執行期,反射可見。@Target:限定適用程式元素型別。@Documented:納入 Javadoc。
@Description(value = "這是一個有用的工具類")
public class Utility {
@Author(name = "haoran_202", group = "com.magc")
public String work() {
return "work over!";
}
}
public class AnalysisAnnotation {
public static void main(String[] args) {
try {
Class> clazz = Class.forName("com.magc.annotation.Utility");
// 類級註解
if (clazz.isAnnotationPresent(Description.class)) {
Description desc = clazz.getAnnotation(Description.class);
System.out.println("Utility's Description---> " + desc.value());
}
// 方法級註解
for (Method method : clazz.getMethods()) {
if (method.isAnnotationPresent(Author.class)) {
Author author = method.getAnnotation(Author.class);
System.out.println("Utility's Author---> " + author.name() + " from " + author.group());
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Utility's Description---> 這是一個有用的工具類 Utility's Author---> haoran_202 from com.magc
註解將「配置」內嵌至「代碼」,實現聲明式編程。掌握其保留策略、目標限制、反射解析流程,是開發高擴展性框架、理解主流技術棧的必修課。