Java 8 引入類型注解,將注解從「聲明處」延伸至「類型使用處」,為靜態分析、代碼生成、框架增強開闢新維度。本文系統講解語法、Checker Framework、元編程應用、前瞻趨勢。
// 聲明處(舊)
@NonNull String name;
// 類型使用處(Java 8 新增)
List<@NonNull String> strings; // 泛型類型參數
(@Immutable Graph) graph; // 強制類型轉換
new @Interned String("text"); // new 表達式
throws @Critical Exception; // 異常聲明
() -> @Nullable String.valueOf(x); // Lambda 返回類型
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Encrypted {}
TYPE_USE:所有類型使用位置TYPE_PARAMETER:泛型聲明處(class Box<@NonNull T>)send(File) 與 send(@Encrypted File) 視為同一簽名void send(@Open Connection this, @Encrypted File file) 為 this 添加注解基于 JSR 308 實現的可插拔類型系統,編譯期自動檢測缺陷:
| 檢查器 | 核心注解 | 檢測目標 |
|---|---|---|
| Nullness | @NonNull, @Nullable | 空指針解引用 |
| Regex | @Regex, @Pattern | 正則表達式語法/匹配 |
| Tainting | @Untainted, @Tainted | SQL 注入、XSS 污染數據流 |
| Units | @m, @kg, @s, @Percent, @BasisPoints | 物理量/金融單位混用 |
| Lock | @GuardedBy, @Holding | 並發鎖保護一致性 |
| Signature | @Signed, @Unsigned | 簽名驗證邏輯 |
void demo(@Nullable Object obj) {
obj.hashCode(); // 警告:可能為 null
if (obj != null) {
obj.hashCode(); // 安全:控制流收窄類型
}
}
// 默認參數 @NonNull,極少需顯式注解
/*@NonNull*/ String
// 方法級
@Transactional void transfer(@Validated Account from, @Validated Account to);
// 參數級(類型注解)
void audit(@Pii String ssn); // 自動插入脫敏邏輯
// 局部變量級(Java 8 新增)
@Trace Request req = parse(); // 自動埋點追蹤該變量所有操作
@Autowired Store productStore;
@Autowired Store serviceStore;
// 無需 ProductStore/ServiceStore 顯式類
@Approx 近似計算 → 低功耗硬件加速,Checker Framework 保證不污染控制流類型注解將「文檔化意圖」升級為「機器可驗證契約」。結合 Checker Framework 等工具,實現編譯期保證運行時安全;賦能框架實現更精準的元編程。現在是探索並採用的最佳時機。