自定义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的一张图,非常直观

android反射组件 (一)java 自定义annotation基础知识
原文:http://blog.csdn.net/lsong89/article/details/40399967