注解(Annotation)
注解是JDK1.5的新特性,相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记.
当为程序打上标记后
,javac编译器、开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,并根据指定的标记做相应的事。
标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
JavaAPI中提供的注解:
@SuppressWarnings
生命周期:
RetentionPolicy.SOURCE
@SuppressWarnings用于指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告
如: @SuppressWarnings"Deprecated",编译器将不会在调用此被标记的已过时方法时发出警告。
@Override
生命周期:
RetentionPolicy.SOURCE
@Overrride用于标识方法是否重写了父类的方法,被@Override标记过的方法如果没有完成对父类方法的重写,编译器会发出警告。
@Deprecated
生命周期 :
RetentionPolicy.RUNTIME
用 @Deprecated 注释的程序元素,表示此程序元素是过时的,
在调用被 @Deprecated 注释的程序元素时 ,编译器会发出警告。
例如:如果我们基于原有的方法提供了更好的方法时,我们不能将原有的方法作废,但可以为原有的方法添加此注释,以此提醒程序员在调用该方法时,还有更优的方法实现。
用 @Deprecated 注释的程序元素,表示此程序元素是过时的,
在调用被 @Deprecated 注释的程序元素时 ,编译器会发出警告。
例如:如果我们基于原有的方法提供了更好的方法时,我们不能将原有的方法作废,但可以为原有的方法添加此注释,以此提醒程序员在调用该方法时,还有更优的方法实现。
@Retention
生命周期 :
RetentionPolicy.RUNTIME
又称元注解,它的主要作用是对指定的注解的生命周期进行声明,有三种取值,
如果一个注解在定义时没有元注解对其生命周期进行声明,则此注解的默认生命周期是
RetentionPolicy.CLASS,即在源文件阶段
@Retention的三种取值: 注解的生命周期
RetentionPolicy.SOURCE: Java源文件阶段,
编译器要丢弃的注释。
RetentionPolicy.CLASS: Class文件阶段, 编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。
RetentionPolicy.RUNTIME: 内存中的字节码阶段, 编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。
RetentionPolicy.CLASS: Class文件阶段, 编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。
RetentionPolicy.RUNTIME: 内存中的字节码阶段, 编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。
@Target
指示注解所适用的程序元素的种类。如果注解声明中不存在 Target元注释,则声明的类型可以用在任一程序元素上。
如果存在这样的元注释,则编译器强制实施指定的使用限制。
注解的应用
注解就相当于一个你的源程序中要调用的一个类,在源程序中应用某个注解,得先准备好这个注解类,就像你要调用某个类得先开发好这个类。
注解应用结构图
注解的属性
- 定义基本类型的属性和应用属性:
- 在注解类中增加String color();
- @MyAnnotation(color="red");
- 用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法
- MyAnnotation a = (MyAnntation)AnntationTest.class.getAnnotation(MyAnnotation);
- System.out.println(a.color());
- 可以认为上面这个@MyAnnotation是MyAnnotation类的一个实例对象
- 为属性指定缺省值:
- String color() default "grean";
- value属性
- String value() default "zxx";
- 如果注解中有一个名称为value的属性,且你只想设置value属性(即其他属性都采用默认值或者你只有一个value属性),那么可以省略value=部分,
- 例如:@MyAnnotation("lhm");
- 数组类型的属性
- int[] arrayAttr() default{1,2,3};
- @MyAnnotation(arrayAttr={2,3,4});
- 如果数组属性中只有一个元素,这时候属性值部分可以省略大括号
- 枚举类型的属性
- EnumTest.TrafficLamp lamp();
- @MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)
- 注解类型的属性:
- MetaAnnotation annotationAttr() default @MetaAnnotation("xxxx");
- @MyAnnotation(annotationAttr=@MetaAnnotation("yyy"))
- 可以认为上面这个@MyAnnotation是MyAnnotation类的一个实例对象,
- 同样的道理,可以认为上面这个@MetaAnnotation是MetaAnnotation类的一个实例对象,
- 调用代码如下:
- MetaAnnotation ma = myAnnotation.annotationAttar();
- System.out.println(ma value());