• Java自定义注解解析


    关键字@interface

    public @interface MuAnnotation {
    }
    
    • 1
    • 2

    注解的内部

    以@SuppressWarnings为例,发现内部
    在这里插入图片描述
    这value是属性还是方法?
    答案:看上去是无参数方法,实际上理解为一个成员变量,一个属性
    无参数方法名字–》成员变量的名字
    无参数方法的返回值–》成员变量的类型
    这个参数叫 配置参数

    无参数方法的类型:基本数据类型(八种),String,枚举,注解类型,还可以是以上类型对应的数组。

    PS:注意:如果只有一个成员变量的话,名字尽量叫value。

    使用注解

    (1)使用注解的话,如果你定义了配置参数,就必须给配置参数进行赋值操作:

    @MyAnnotation(value={"abc","def","hij"})
    public class Person {
    }
    
    • 1
    • 2
    • 3

    (2)如果只有一个参数,并且这个参数的名字为value的话,那么value=可以省略不写。

    @MyAnnotation({"abc","def","hij"})
    public class Person {
    }
    
    • 1
    • 2
    • 3

    (3)如果你给配置参数设置默认的值了,那么使用的时候可以无需传值:

    public @interface MyAnnotation2 {
        String value() default "abc";
    }
    
    • 1
    • 2
    • 3

    (4)一个注解的内部是可以不定义配置参数的:

    public @interface MyAnnotation3 {
    }
    
    • 1
    • 2

    元注解

    元注解是用于修饰其它注解的注解。

    @Target({ElementType.TYPE,ElementType.FIELD,ElementType.CONSTRUCTOR,ElementType.METHOD})
    public @interface MyAnnotation4 {
    }
    
    • 1
    • 2
    • 3

    JDK5.0提供了四种元注解:Retention, Target, Documented, Inherited

    Retention

    @Retention:用于修饰注解,用于指定修饰的那个注解的生命周期,
    @Rentention包含一个RetentionPolicy枚举类型的成员变量,使用
    @Rentention时必须为该value成员变量指定值:
    ➢RetentionPolicy.SOURCE:在源文件中有效(即源文件保留),编译器直接丢弃这种策略的注释,在.class文件中不会保留注解信息
    案例:
    在这里插入图片描述
    反编译查看字节码文件:发现字节码文件中没有MyAnnotation这个注解:
    在这里插入图片描述
    ➢RetentionPolicy.CLASS:在class文件中有效(即class保留),保留在.class文件中,但是当运行Java程序时,他就不会继续加载了,不会保留在内存中,JVM不会保留注解。如果注解没有加Retention元注解,那么相当于默认的注解就是这种状态。
    案例:
    在这里插入图片描述
    反编译看字节码文件,字节码文件中带有MyAnnotation注解:
    在这里插入图片描述
    ➢RetentionPolicy.RUNTIME:在运行时有效(即运行时保留),当运行 Java程序时,JVM会保留注释,加载在内存中了,那么程序可以通过反射获取该注释。

    Target

    用于修饰注解的注解,用于指定被修饰的注解能用于修饰哪些程序元素。@Target也包含一个名为value的成员变量。
    案例:

    @Target({ElementType.TYPE,ElementType.CONSTRUCTOR,ElementType.METHOD})
    public @interface MyAnnotation4 {
    }
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    Documented(很少用)

    用于指定被该元注解修饰的注解类将被javadoc工具提取成文档。默认情况下,javadoc是 不包括注解的,但是加上了这个注解生成的文档中就会带着注解了

    Inherited(很少用)

    被它修饰的Annotation将具有继承性。如果某个类使用了被
    @Inherited修饰的Annotation,则其子类将自动具有该注解。
    案例:
    注解:如果MyAnno注解使用了@Inherited之后,就具备了继承性,那么相当于子类Student也使用了这个MyAnno
    在这里插入图片描述
    父类:
    在这里插入图片描述
    子类:
    在这里插入图片描述

  • 相关阅读:
    Linux系统编程:编译过程以及GDB调试
    2022.8.22-8.28 AI行业周刊(第112期):个人定位发展
    超大规模研究发现,缺乏维生素D,增加早逝风险
    Python3安装
    java面试题整理《微服务篇》二
    tomcat 把webappp设置在其他目录
    Kafka Stream 学习笔记-3 DSL‘s stateless stateful
    python环境搭建
    android安全测评修复小记(备用)
    (十九)mmdetection源码解读:Hook子类之一OptimizerHook
  • 原文地址:https://blog.csdn.net/manba_yqq/article/details/126257674