JDK中四个基本的元注解 [Java]

jdk中四个基本的元注解的使用

那么首先我们就要知道什么是元注解

修饰现有的注解的注解我们就称之为元注解(meta - annotation)

  • 也就是和元数据一样,我们将修饰现有的数据的数据称之为元数据(MetaData)

下面就是jdk中四个基本的元注解

1. Retention

@Retention只能用于修饰注解,用于指定该注解的生命周期

  • @Retention元注解中包含了一个RetentionPolicy类型的成员变量(也就是配置参数),变量名为value

    • 这里的RetentionPolicy是一个枚举类
  • 使用@Retention时必须要为该声明为value的成员变量赋值,如果不赋值,则默认value值为RetentionPolicy.CLASS

    • 而RetentionPolicy枚举类中的枚举值一共有如下三个:

      1. RetentionPolicy.SOURCE

        • 在源文件中有效,编译器直接会丢弃这种方式修饰的注解
        • 也称之为:“源文件保留”
      2. RetentionPolicy.CLASS

        • 在class文件中有效,当运行java程序时,JVM不会保留这种方式修饰的注解
        • 也称之为:“class保留”
        • RetentionPolicy.CLASS是@Retention中的默认值
      3. RetentionPolicy.RUNTIME

        • 在程序运行时也有效,当运行java程序时,JVM会保留这种方式修饰的注解

        • 注意: 修饰为这种方式的注解我们可以通过反射来获取到该注解
        • 也称之为: “运行时保留”

          • 当为运行时保留时我们就可以通过反射获取到被该元注解修饰的注解的信息
  • 这里通过一幅图来理解Retention修饰注解的生命周期

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EyT3v5Pa-1644242288827)(E:\非凡英才\java笔记\图解@Retention指明现有注解声明周期图解.png)]

2. Target

@Target只能用于修饰现有的注解(Annotation),用于指定被修饰的注解的目标(也就是指明被修饰的注解可以修饰哪些程序元素)

  • @Target包含了一个ElementType[] 类型的成员变量,变量名为value

    • ElementType是一个枚举类
  • ElementType枚举类中的枚举值有以下7种 (jdk8.0之前)

    • 注意: jdk8.0中又添加了两个枚举值(通过新添加的这两个枚举值从而实现了类型注解)
    1. CONSTRUCTOR

      • 用于修饰构造器
    2. FIELD

      • 用于修饰域(也就是属性(也就是成员变量))
    3. LOAL_VARIABLE (variable 中文 变量)

      • 用于修饰局部变量
    4. METHOD

      • 用于修饰方法
    5. PACKAGE

      • 用于修饰包
    6. PARAMETER( parameter 中文 参数)

      • 用于修饰参数
    7. TYPE

      • 用于修饰类,接口(包括注解类型,枚举类的声明
3. Documented

@Documented只能用于修饰现有的注解

  • 被@Documented元注解修饰的注解将在被javadoc工具提取成文档时保留下来

    • 默认情况下,Javadoc生成文档时不会保留注解的,除非此注解使用@Documented元注解修饰
  • 注意:使用@Documented元注解修饰的注解的声明周期必须设置为"运行时保留",也就是必须设置@Retention的值为RetentionPolicy.RUNTIME
4. Inherited

@Inherited元注解只能用于修饰现有的注解

  • 被@Inherited元注解修饰的注解将具有继承性
    • 这里的具有继承性指的是: 如果某一个类使用了被@Inherited修饰的注解,那么其子类也将自动具有该注解
      • 那么具体的我们如何验证其子类是否真正的继承了该注解,我们可以将这个注解的生命周期设置为"运行时保留",然后再通过反射去获得修饰子类的注解,然后去判断

总结:

  1. 定义注解通常都是指明两个元注解: Retention(声明周期)和Target(目标)
    • 也就是在实际编程中,Retention和Target使用的比较多,而Documented和Inherited则使用的比较少
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值