首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 註解 完整教學:內建註解、自訂註解、屬性、保留策略、目標、反射讀取

     編輯:Java 相關知識

什麼是註解

註解是加在程式碼上的**中繼資料**,不直接影響執行邏輯,供編譯器、工具、執行期反射讀取。語法:@AnnotationName。

三大內建註解

自訂註解四步驟

  1. 宣告:public @interface MyAnn { }
  2. 指定保留策略:@Retention(RetentionPolicy.RUNTIME)
  3. 指定作用目標:@Target({ElementType.TYPE, ElementType.METHOD})
  4. 定義屬性:String value() default "";

完整範例


import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface MyAnnotation {
    String value();                    // 必填
    String color() default "red";      // 可選,有預設值
    WeekDay week() default WeekDay.MON; // 列舉型別
    int[] ids() default {1,2,3};       // 陣列型別
    Class clazz() default String.class; // Class 型別
    OtherAnnotation ann() default @OtherAnnotation("x"); // 註解巢狀
}

enum WeekDay { MON, TUE, WED }

@Retention(RetentionPolicy.RUNTIME)
@interface OtherAnnotation { String value(); }

// 使用
@MyAnnotation(value="demo", color="blue", week=WeekDay.WED, ids={5}, clazz=Integer.class)
public class Demo {
    @MyAnnotation("method-value")
    public void test() {}
}

反射讀取註解


// 類別層級
if (Demo.class.isAnnotationPresent(MyAnnotation.class)) {
    MyAnnotation ann = Demo.class.getAnnotation(MyAnnotation.class);
    System.out.println(ann.value());   // demo
    System.out.println(ann.color());   // blue
    System.out.println(ann.week());    // WED
    System.out.println(ann.ids().length); // 1
    System.out.println(ann.clazz());   // class java.lang.Integer
}

// 方法層級
Method m = Demo.class.getMethod("test");
MyAnnotation mAnn = m.getAnnotation(MyAnnotation.class);
System.out.println(mAnn.value()); // method-value

保留策略對照

註解用途範例
@Override檢查是否正確覆寫父類方法編譯期報錯防止拼錯方法名
@SuppressWarnings抑制特定編譯警告@SuppressWarnings("unchecked")
@Deprecated標記 API 已過時IDE 會劃線提醒
策略存活範圍適用場景
SOURCE僅原始碼,編譯捨棄@Override, @SuppressWarnings
CLASS.class 檔案,JVM 不載入預設值,框架掃描 class 檔
RUNTIMEJVM 載入,反射可讀執行期驗證、AOP、配置綁定

目標類型


@Target({
    ElementType.TYPE,        // 類別/介面/列舉
    ElementType.METHOD,      // 方法
    ElementType.FIELD,       // 欄位
    ElementType.PARAMETER,   // 參數
    ElementType.CONSTRUCTOR, // 建構子
    ElementType.LOCAL_VARIABLE,
    ElementType.ANNOTATION_TYPE,
    ElementType.PACKAGE,
    ElementType.TYPE_PARAMETER,  // Java 8+
    ElementType.TYPE_USE         // Java 8+
})

最佳實務

  1. 業務註解務必加 @Retention(RUNTIME),否則反射讀不到。
  2. 屬性命名慣用 value() 作為單一主要屬性,使用時可省略屬性名:@Ann("x")。
  3. 陣列屬性單值時可省略大括號:ids=5 等同 ids={5}。
  4. 配合 AnnotationProcessor (APT) 可在編譯期產生程式碼/檢查規範。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved