自定义annotation包括三部分: 自定义annotation、使用annotation的类、annotation的处理方法。
一、自定义annotation
元注解包括以下:
1)@Target 描述注解使用的范围
取值包括:
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
2) @Retention 定义了注解被保留的时间段
取值包括:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
3)@Documented 是否可以被工具文档化
4)@Inherited 注解是否可以被子类继承
实例代码:
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FruitName { public String value() default ""; } @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FruitColor { public enum Color {BULE, RED, GREEN} public Color fruitColor() default Color.GREEN; }
二、使用annotation的类
实例代码:
public class Apple { @FruitName("Apple") private String appleName; @FruitColor(fruitColor=FruitColor.Color.RED) private String appleColor; public void setAppleColor(String appleColor) { this.appleColor = appleColor; } public String getAppleColor() { return appleColor; } public void setAppleName(String appleName) { this.appleName = appleName; } public String getAppleName() { return appleName; } public void displayName(){ System.out.println("水果的名字是: "+ appleName + " 水果的颜色是:"+ appleColor); } }
三、annotation处理方法
实例代码:
public class FruitInfoUtil { public static void getFruitInfo(Object obj){ Class<?> clazz = obj.getClass(); Field[] fields = clazz.getDeclaredFields(); for(Field field : fields){ if(field.isAnnotationPresent(FruitName.class)){ FruitName fruitName = (FruitName)field.getAnnotation(FruitName.class); try { field.setAccessible(true); field.set(obj, fruitName.value()); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } }else if(field.isAnnotationPresent(FruitColor.class)){ FruitColor fruitColor = (FruitColor)field.getAnnotation(FruitColor.class); try { field.setAccessible(true); field.set(obj, fruitColor.fruitColor().toString()); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } } }
LAST: main方法
public class Main { public static void main(String[] args) { Apple apple = new Apple(); FruitInfoUtil.getFruitInfo(apple); apple.displayName(); } }
运行结果:
水果的名字是: Apple 水果的颜色是:RED
上传下别人总结的annotation的一张图,非常直观