注解,就是在类的某一个部分打上一个标记,那么注释类型的注释要保留多久呢?如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS只有元注释类型直接用于注释时,Target 元注释才有效。如果元注释类型用作另一种注释类型的成员,则无效。注解保留时间:
RetentionPolicy.CLASS:编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。
RetentionPolicy.RUNTIME:编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。
RetentionPolicy.SOURCE:编译器要丢弃的注释。
下面定义一个注解,举一个例:
@Retention(value=RUNTIME)
public @interface Test{
String value();
}
上面介绍了注解保存多久,如何定义,那注解可以使用在哪些地方呢?注解放在哪个地方用@Target元注解定义。
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.FIELD})
public @interface Bogus {
...
}
这样定义一个注解到底放在哪个地方,如果想让注解放在多个地方,在()加一个{}在大括号里面一一写出可放的位置,用逗号隔开。
可放的位置:
ElementType.ANNOTATION_TYPE:注释类型声明
ElementType.CONSTRUCTOR :构造方法声明
ElementType.FIELD :字段声明(包括枚举常量)
ElementType.LOCAL_VARIABLE :局部变量声明
ElementType.METHOD :方法声明
ElementType.PACKAGE :包声明
ElementType.PARAMETER: 参数声明
ElementType.TYPE :类、接口(包括注释类型)或枚举声明
注解放在这些地方什么时候起作用呢?其实注解并没有什么作用,它只是起到一个标记的作用。只有注解处理类来处理它,这里就需要使用一些反射技术了,在一个类中,我们得到了其它的类的对象,我们就可以能过反射来得到它身上是否有这个标记。然后再针对这个标记的值进行处理。
注解的属性:
注解的属性的定义,跟在接口里面定义方法基本上相同,唯一不同的是注解里面的属性可以定义缺省值。一个属性定义后,如果我们想给它一个缺省值,就可以直接在后面写上缺省值,这样,在用这个注解的时候就可以不用给这个属性赋值,它就会使用缺省值。有一个特殊的属性,叫value这个可以定义后,使用的时候可以直接写值,直接写值,就相于是赋值给这个属性的。