注解类:要应用注解,就要开发出来一个注解类,这就像要用到某个类,这个类得先存在一样。
public @interface AnnotationTest {}
应用了注解的类:在一个程序中应用注解就好像调用了一个注解类(一个程序可以加多个注解)
@AnnotationTest
public class TestAnnotation {
public static void main(String[] args) {
}
}
对应用了注解的类进行操作:又了上面两个步就能操作注解的信息了。
要对一个类检查或者是获取这个类的信息就要用到反射,要用反射就要获被检查的那个类的字节码。
@AnnotationTest
public class TestAnnotation {
public static void main(String[] args) {
//判断TestAnnotation是否加了注解@AnnotationTest
if(TestAnnotation.class.isAnnotationPresent((AnnotationTest.class))){
//如果加了注解就获得这个注解
AnnotationTest test = (AnnotationTest)TestAnnotation.class.getAnnotation(AnnotationTest.class);
//打印出这个注解对象的信息
System.out.println(test);
}
}
}
运行程序这里不会打印出任何信息,这说明if的条件是false,这里明明应用了注解,怎么会出现false呢?这就是类加载器在加载class文件到
内存中时会对class文件进行处理,处理时会不会把注解留下,这就和注解的生命周期有关,如果把public @interface AnnotationTest {}改
成
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
//元注解:注解的注解
//其值就是注解的生命周期
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationTest {
}
这时就会打印出test的信息@test.AnnotationTest()
注解的生命周期有三个阶段
@Retention(RetentionPolicy.RUNTIME)
@Retention(RetentionPolicy.SOURCE)
@Retention(RetentionPolicy.CLASS)
分别对应java源文件—>class文件—>内存中的字节码
默认值就是RetentionPolicy.CLASS
另一个注解@Target这个注解的值说明了这个注解类应该被应用在类上还是方法上或者是其他的地方@Target(ElementType.TYPE)应用到类上
@Target(ElementType.METHOD)应用到方法上等如果用错了地方就会报错。