背景介绍
注解在java中是个比较重要的概念。几乎所有框架中都自定义了相当数量的注解。
定义注解
在下面的定义注解的代码中,@interface就指明这是在定义注解。同时在定义注解时,我们使用了几个元注解。其中,Target表示该注解用于什么地方,可能的值在枚举类 ElemenetType 中,这里表示注解用于方法上。常用的还有ElemenetType.TYPE,说明用在 类,接口(包括注解类型)或enum声明。Retention表示这种类型的注解会被保留到那个阶段,这里表示这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用。Documented 指明该注解包含在Javadoc中。Inherited则允许子类继承父类中的注解。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface UseCase
{
public int id() default -1;
// public int value();
public String description() default "no description";
}
使用注解
public class Handlee
{
@UseCase(id = 1)
public void showID(){
}
@UseCase(id = 2)
public void getID(){
}
}
注解处理器
通过java另一个强大的功能反射来获得一个类上标注的注解。这里trackUseCases()方法通过传入的类型参数来获得该类上的注解信息。
public class AnnotationProcessor
{
public static void trackUseCases(Class<?> cls){
for (Method method : cls.getDeclaredMethods()){
UseCase useCase = method.getDeclaredAnnotation(UseCase.class);
System.out.println(useCase.id()+": " + useCase.description());
}
}
}
客户端调用
public class Client
{
public static void main(String[] args) {
AnnotationProcessor.trackUseCases(Handlee.class);
}
}