注解是jdk1.5新增特性,可用来修饰类、方法、属性。注解处理器利用反射获取类、方法、属性头上的注解,并提取出其中的参数来做出相应的逻辑处理。注解处理器是用于分析注解的,针对每一个已经定义的注解都必须给出对应的注解处理器,否则注解不会起到任何作用。
// 元注解,jdk提供的四个用于修饰自定义注解的注解
// 设置自定义注解修饰的对象范围,从枚举ElementType中获取
// ElementType.TYPE:类、接口、注解、枚举
// ElementType.FIELD:成员变量
// ElementType.LOCAL_VARIABLE:局部变量
// ElementType.METHOD:方法
// ElementType.PARAMETER:参数
// ElementType.CONSTRUCTOR:构造器
// ElementType.PACKAGE:包
// 表示该注解可修饰类、接口、注解、枚举修,也可修饰方法
@Target({ElementType.TYPE, ElementType.METHOD})
// 设置自定义注解的生命周期周期,从枚举RetentionPolicy中获取
// RetentionPolicy.SOURCE:源文件中有效
// RetentionPolicy.CLASS:类文件中有效
// RetentionPolicy.RUNTIME:运行时有效
// 表示该注解在程序运行时其作用
@Retention(RetentionPolicy.RUNTIME)
// 标记注解,无参数,用于标记自定义注解,被标记的注解修饰的类可以被文档化
@Documented
// 标记注解,无参数,用于标记自定义注解,被标记的注解修饰的类的子类会继承该注解
@Inherited
// 自定义注解,在接口关键字interface前加@,可用元注解来修饰自定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation {
// 方法声明就是注解参数声明,方法名字是注解参数名字,方法返回类型是注解参数类型
// 参数类型只能是基本类型、Class、String、enum、注解类型,以上类型的数组
// 访问修饰符只能为public或默认,若只有一个参数,建议参数名用value
public String a();
// default可指定参数的默认值
public int b() default -1;
}
// 注解处理器需要由使用注解的用户自己调用,如以拦截器的形式处理注解,自定义类加载器的形式处理注解
public class MyAnnotationHandler {
public static void handle(String className, String methodName) {
Method m = Class.forName(className).getDeclaredMethod(methodName);
// 以反射的形式获取类的注解对象,根据注解对象获取注解信息
MyAnnotation my = m.getAnnotation(MyAnnotation.class);
System.out.println(my.a());
System.out.println(my.b());
}
}