一 元注解
1:@Retention元注解 ,表示注解有效存在的生命周期长短,取值有如下
- @Retention(RetentionPolicy.SOURCE)
存在源码阶段,javac将java源码编译成.class文件后,注解失去作用。也就是当在Java源程序上加了一个注解,这个Java源程序要由javac去编译,javac把java源文件编译成.class文件,在编译成class时可能会把Java源程序上的一些注解给去掉,java编译器(javac)在处理java源程序时,可能会认为这个注解没有用了,于是就把这个注解去掉了,那么此时在编译好的class中就找不到注解了, 这是编译器编译java源程序时对注解进行处理的第一种可能情况 - @Retention(RetentionPolicy.CLASS)
存在源码以及.class文件阶段,类加载器将.class文件加载到内存中去的时候,注解失去作用。也就是class文件中的东西不是字节码,class文件里面的东西由类加载器加载到内存中去,类加载器在加载class文件时,会对class文件里面的东西进行处理,如安全检查,处理完以后得到的最终在内存中的二进制的东西才是字节码,类加载器在把class文件加载到内存中时也有转换,转换时是否把class文件中的注解保留下来。 - @Retention(RetentionPolicy.RUNTIME)
存在源码,.class文件阶段以及 内存中的字节码运行时阶段
备注:一个注解的生命周期有三个阶段:java源文件是一个阶段,class文件是一个阶段,内存中的字节码是一个阶段,javac把java源文件编译成.class文件时,有可能去掉里面的注解,类加载器把.class文件加载到内存时也有可能去掉里面的注解,因此在自定义注解时就可以使用Retention注解指明自定义注解的生命周期,自定义注解的生命周期是在RetentionPolicy.SOURCE阶段(java源文件阶段),还是在RetentionPolicy.CLASS阶段(class文件阶段),或者是在RetentionPolicy.RUNTIME阶段(内存中的字节码运行时阶段),根据JDK提供的API可以知道默认是在RetentionPolicy.CLASS阶段 (JDK的API写到:the retention policy defaults to RetentionPolicy.CLASS.)
2:@Target元注解
@Target元注解决定了一个注解可以标识到哪些成分上,如标识在在类身上,或者属性身上,或者方法身上等成分,@Target默认值为任何元素(成分)
二 注解简单使用
创建注解
/**
* 使用元注解进行标注
*/
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface MyAnotation {
String color () default "green";
String value();
}
注解使用
@MyAnotation(color = "blue",value = "你好")
public class AnotationUser {
public void main(){
if(AnotationUser.class.isAnnotationPresent(MyAnotation.class)){
MyAnotation myAnotation=AnotationUser.class.getAnnotation(MyAnotation.class);
myAnotation.color();
myAnotation.value();
}
}
}
本文完全参考摘抄自注解,只为个人学习。
参考文章java注解-最通俗易懂的讲解
网友评论