java 注解实现类@interface

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术学习分享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值