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

Java 注解(Annotation)處理器實戰:反射獲取註解信息完整示例

     編輯:Java 相關知識

註解處理器核心 API

Java SE5 擴展反射 API,java.lang.reflect.AnnotatedElement 接口為程序元素(類、方法、構造器、字段、包)提供統一註解訪問能力。實現類:Class、Method、Constructor、Field、Package。

四大核心方法

方法說明
<T extends Annotation> T getAnnotation(Class<T> annotationClass)獲取指定類型註解,不存在返回 null
Annotation[] getAnnotations()獲取所有註解(含繼承)
boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)判斷是否包含指定註解
Annotation[] getDeclaredAnnotations()獲取直接聲明的註解(不含繼承)

前提:註解類型需標記 @Retention(RetentionPolicy.RUNTIME),否則運行時不可見。

完整實戰示例:水果信息系統

1. 定義註解類型

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitName { String value() default ""; }

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitColor {
    public 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 "";
}

2. 使用註解裝飾實體類

public class Apple {
    @FruitName("Apple")
    private String appleName;

    @FruitColor(fruitColor = Color.RED)
    private String appleColor;

    @FruitProvider(id = 1, name = "陝西紅富士集團", address = "陝西省西安市延安路89號紅富士大廈")
    private String appleProvider;
    // getter/setter 省略
}

3. 註解處理器工具類

public class FruitInfoUtil {
    public static void getFruitInfo(Class<?> clazz) {
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(FruitName.class)) {
                FruitName fn = field.getAnnotation(FruitName.class);
                System.out.println("水果名稱:" + fn.value());
            } else if (field.isAnnotationPresent(FruitColor.class)) {
                FruitColor fc = field.getAnnotation(FruitColor.class);
                System.out.println("水果顏色:" + fc.fruitColor());
            } else if (field.isAnnotationPresent(FruitProvider.class)) {
                FruitProvider fp = field.getAnnotation(FruitProvider.class);
                System.out.println("供應商編號:" + fp.id() + " 名稱:" + fp.name() + " 地址:" + fp.address());
            }
        }
    }
}

4. 運行測試

public class FruitRun {
    public static void main(String[] args) {
        FruitInfoUtil.getFruitInfo(Apple.class);
    }
}

5. 輸出結果

水果名稱:Apple
水果顏色:RED
供應商編號:1 名稱:陝西紅富士集團 地址:陝西省西安市延安路89號紅富士大廈

進階提示

  • 組合註解:@interface Config { DBConfig db(); CacheConfig cache(); }
  • 註解處理器插件化:實現 javax.annotation.processing.Processor 實現編譯期處理(如 Lombok、MapStruct 原理)。
  • 性能:反射訪問註解有開銷,熱點路徑建議緩存 Annotation 對象或使用字節碼操作庫 (ASM/ByteBuddy)。

註解知識點導圖

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved