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),否則運行時不可見。
@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 "";
}
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 省略
}
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());
}
}
}
}
public class FruitRun {
public static void main(String[] args) {
FruitInfoUtil.getFruitInfo(Apple.class);
}
}
水果名稱:Apple
水果顏色:RED
供應商編號:1 名稱:陝西紅富士集團 地址:陝西省西安市延安路89號紅富士大廈
@interface Config { DBConfig db(); CacheConfig cache(); }javax.annotation.processing.Processor 實現編譯期處理(如 Lombok、MapStruct 原理)。Annotation 對象或使用字節碼操作庫 (ASM/ByteBuddy)。