jdk5中加入了注解这个特性,注解就是一种标记,在java中,注解可以加在包,类,字段、方法、方法的参数以及局部变量上.使用注解的意义在于:根据类(或方法等)上的标记对它进行相应的处理.
1.注解的声明
/** * 注解的声明 */ @Target({ElementType.TYPE,ElementType.METHOD}) // 注解可以用在类和方法上 @Retention(RetentionPolicy.RUNTIME) // 注解在运行期有效 public @interface MyAnnotation { /** 声明注解的属性 **/ String name(); int[] values() default {}; // 默认值为空数组 }
在注解的声明过程通常会使用两个元注解用来说明注解的适用对象和有效域.
@Target:声明注解的适用对象,可以是包,类,字段,方法,方法的参数和局部变量.@Target接收一个ElementType类型的数组来表示注解的使用对象.ElementType是一个枚举类型,表示注解的适用范围.一个注解可以同时用在多个地方,例如,@Target({ElementType.TYPE,ElementType.METHOD})表示该注解可以使用在类和方法上.
@Retention声明注解的有效期,注解的有效期分为:java源文件,编译成的class文件,以及运行时期的字节码.这三个有效期对应RetentionPolicy.SOURCE,RetentionPolicy.CLASS,RetentionPolicy.RUNTIME.例如 @Override是给编译器看的,所以它有效期为java源文件.通常,我们自定义的注解有效期都是运行期,因为我们要在运行时根据注解做出相应的处理.
@Target和@Retention用于声明注解的特性,这类注解也称为元注解.
注解的属性声明语法上与接口中方法声明类似,@MyAnnotation声明了两个属性,一个name属性,一个values属性.name属性没有默认值,在使用MyAnnotation注解时必须给它赋值,values属性有默认值,使用注解时可以不用赋值.
2.使用注解的类
现在我们把上面声明的注解用到AnnotationedBean上.
@MyAnnotation(name="test",values={1,2,3}) public class AnnotationedBean { // class members }
3.注解处理器
经过上面的两个步骤后,终于到了感受注解的威力的时候.我们可以根据类上注解的属性来对他进行针对性处理。
/** * 注解处理器 */ public class AnnotationHandler {
public void handle(){ // 如果类上有MyAnnotation注解 if(AnnotationedBean.class.isAnnotationPresent(MyAnnotation.class)){ // 获取注解 MyAnnotation myAnnotation = AnnotationedBean.class.getAnnotation(MyAnnotation.class); // 获取注解的属性 String name = myAnnotation.name(); int[] arr = myAnnotation.values(); // if name ---> do work // if arr ---> do work } } public static void main(String[] args) { new AnnotationHandler().handle(); } }
java中所有注解都是java.lang.annotation的子类,注解详细的内容可以参考api文档和java语言规范.