------- android培训、java培训、期待与您交流! ----------
注解类:@interface A{
}
应用了注解的类:@A
Class B{
}
对“应用了注解的类”进行反射操作的类:Class C{
B.class.isAnnotionPresent(A.class);
A a = B.class.getAnnotion(A.class);
}
元注解:相当于对注解的解释。
@Retention元注解:有三种取值:
RetentionPolicy.SOURCE:源文件,编译器要丢弃的注释
RetentionPolicy.CLASS:class文件,这是默认值,编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释
RetentionPolicy.RUNTIME:内存中的字节码,编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取
@Target元注解:表示注解要应用了什么元素类型,有以下几种取值:
ANNOTATION_TYPE:注释类型声明
CONSTRUCTOR: 构造方法声明
FIELD :字段声明(包括枚举常量)
LOCAL_VARIABLE:局部变量声明
METHOD:方法声明
PACKAGE:包声明
PARAMETER:参数声明
TYPE:类、接口(包括注释类型)或枚举声明
下面举个小例子:
//注解类
@Retention(RetentionPolicy.RUNTIME)//①
@Target({ElementType.METHOD,ElementType.TYPE})//②
public @interface AnnotationExample {
}
//应用了注解的类
@AnnotationExample
public class AnnotationDemo {
public static void main(String[] args) {
if(AnnotationDemo.class.isAnnotationPresent(AnnotationExample.class)){
AnnotationExample annotation =(AnnotationExample) AnnotationDemo.class.getAnnotation(AnnotationExample.class);
System.out.println(annotation);
}else{
System.out.println("AnnotationDemo没有应用注解");
}
}
}
如果把①那一行@Retention元注解注释掉,那么输出结果则是“AnnotationDemo没有应用注解”,因为①那一行的作用就是告诉编译器要把注释记录在类文件中,在运行时 VM 将保留注释;如果不写默认值是RetentionPolicy.CLASS,在运行时就不会检测到有注解,所以程序会走下面的分支。
而②那一行告诉编译器,这个注解可以应用到方法和类上,如果要用到其他元素类型(如字段,局部变量等),程序将会报错。