https://www.bilibili.com/video/BV1we4y137Wy/?spm_id_from=333.999.0.0&vd_source=0d70ce6ab7081e676bd093b0841e1607
package com.decathlon.module.message.annotion;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*
18 * @Retention(RetentionPolicy.SOURCE)
19 * 这个注解的意思是让MyAnnotation注解只在java源文件中存在,编译成.class文件后注解就不存在了
20 * @Retention(RetentionPolicy.CLASS)
21 * 这个注解的意思是让MyAnnotation注解在javAa源文件(.java文件)中存在,编译成.class文件后注解也还存在,
22 * 被MyAnnotation注解类标识的类被类加载器加载到内存中后MyAnnotation注解就不存在了
23 /
/
根据反射的测试的问题,引出@Retention元注解的讲解:其三种取值:RetentionPolicy.SOURCE、RetentionPolicy.CLASS、RetentionPolicy.RUNTIME分别对应:
Java源文件(.java文件)---->.class文件---->内存中的字节码
25 * 这里是在注解类MyAnnotation上使用另一个注解类,这里的Retention称为元注解。
26 * Retention注解括号中的"RetentionPolicy.RUNTIME"意思是让MyAnnotation这个注解的生命周期一直程序运行时都存在
27 */
//这个Java源程序要由javac去编译,javac把java源文件编译成.class文件,在编译成class时可能会把Java源程序上的一些注解给去掉
//Target注解决定MyAnnotation注解可以加在哪些成分上,如加在类身上,或者属性身上,或者方法身上等成分
@Target( { ElementType.METHOD, ElementType.TYPE })
//Retention注解决定MyAnnotation注解的生命周期
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String color() default "blue";
String value() default "blue";//定义一个名称为value的属性
Q
int[] arrayAttr() default {1,2,4};
}
package com.decathlon.module.message.annotion;
@MyAnnotation(color=“black”,value = “jerry tan”, arrayAttr = {3,4,5})
public class AnnotationUse {
public static void main(String[] args) throws Exception{
MyAnnotation annotation = (MyAnnotation) MyAnnotation.class.getAnnotation(MyAnnotation.class);
System.out.println(annotation.color());
}
}
Retention注解说明
当在Java源程序上加了一个注解,这个Java源程序要由javac去编译,javac把java源文件编译成.class文件,在编译成class时可能会把Java源程序上的一些注解给去掉,java编译器(javac)在处理java源程序时,可能会认为这个注解没有用了,于是就把这个注解去掉了,那么此时在编译好的class中就找不到注解了, 这是编译器编译java源程序时对注解进行处理的第一种可能情况,假设java编译器在把java源程序编译成class时,没有把java源程序中的注解去掉,那么此时在编译好的class中就可以找到注解,当程序使用编译好的class文件时,需要用类加载器把class文件加载到内存中,class文件中的东西不是字节码,class文件里面的东西由类加载器加载到内存中去,类加载器在加载class文件时,会对class文件里面的东西进行处理,如安全检查,处理完以后得到的最终在内存中的二进制的东西才是字节码,类加载器在把class文件加载到内存中时也有转换,转换时是否把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.)
https://blog.csdn.net/weixin_40426261/article/details/126566482
https://www.bilibili.com/video/BV1rP4y1X7HR/?spm_id_from=333.999.0.0&vd_source=0d70ce6ab7081e676bd093b0841e1607
https://www.bilibili.com/video/BV1we4y137Wy/?spm_id_from=333.999.0.0&vd_source=0d70ce6ab7081e676bd093b0841e1607
https://www.bilibili.com/video/BV18G411u7n3/?spm_id_from=333.999.0.0&vd_source=0d70ce6ab7081e676bd093b0841e1607
2万+

被折叠的 条评论
为什么被折叠?



