Java四种元注解相关介绍

概述

注解从Java1.5引入以来,不断地简化我们编写代码的流程,逐渐的也成为了我们必学的一项技术。我们学习了各种注解,学习了他们的用法,学习了他们的限制,是否想过他们的组成呢,下面我将我对元注解的理解分享给大家。

元注解是用来修饰注解的注解,在java.lang.annotation包下,当我们需要自己定义一个注解去做某些事情的时候,我们要对该注解进行一些限制,确保我们注解的作用域,有的注解有属性,有的注解没有属性,我们点进去就能看到。这样的注解一共有四个,如下图

定义一个注解用@interface来修饰文件类型,这四个元注解我们一个一个分析

@Documented

该注解是用来声明,我们的注解是否能被JavadocAPI文档生成工具展示出来,如果某个注解上面声明了@Documented,就说明这个注解可以被那些生成文档的工具展示出来。

我们点进去可以看到,该注解用到了三个注解,其中有他自己,还有两个元注解,并且这个注解没有属性,所以我们的使用方法很简单,就是写或者不写该注解。

@Retention

我们点进这个注解可以看到,首先他写了@Documented,说明他是可以被文档生成工具显示到文档中,并且他有一条属性,他同样也对自己使用了@Retention,并且给了一个值->RetentionPolicy.RUNTIME,可以看到跟我们上边的@Documented注解是一样的,然后我们点到RetentionPolicy这个类中去看看这个位置都可以给什么值

首先我们注意到了,这个类是个枚举类,也就是说我们还可以这样写

那么这三个常量都代表什么意思呢

  • SOURCE:我们翻译一下注释:编译器将丢弃注解就是说如果用了他,那么你的注解编译成.class文件之后就会被丢掉,所以如果我们的注解是用来辅助编译过程的,那么我们可以用它。

例如@SuppressWarnings,我们通常用该注解来告诉编译器忽略某些警告信息,编译之后我们就不需要了,所以这个场景用SOURCE肯定是没毛病的

  • CLASS:我们翻译一下注释:编译器将注解记录在类文件中,VM在运行时不需要保留这些注释。这是默认设置行为。也就是说,编译器编译成.class文件后,这个注解仍然存在,但是在我们的jvm去加载.class文件的时候会被丢掉,这个使用的不多所以我们知道这个是什么意思就行。如果不写,默认就是选择CLASS
  • RUNTIME:使用率最高的一个常量,随便去某个类库里去查一下注解,点进去基本都是RUNTIME。老样子,我们先翻译注释:注释将由编译器记录在类文件中,并在运行时由VM定义,因此可以反射性地读取。也就是说这个常量所定义的范围是最大的了,都可以被反射了,也就是不光编译器编译了、JVM加载了还能反射性的读取到,会一直存在。我们自己在定义注解的时候,除非有特殊需要,一般业务也是用这个常量,比较方便一些。

@Target

由图可以看到,这个元注解用到了三个元注解,有我们上边说的两个和他自己。此处我们不过多赘述。再看他的属性,可以看到用到了中括号,说明注解的参数这里是可以放一个枚举数组的,我们点开枚举后可以看到声明了很多常量。

老样子先翻译一下注释,基本都能看出来是啥意思了,TYPE_PARAMETERTYPE_USEJDK1.8加进来的

  • TYPE:类、接口(包括注解类型)或枚举声明。
  • FIELD:字段声明(包括枚举常量)
  • METHOD:方法声明
  • PARAMETER:形式参数声明
  • CONSTRUCTOR:构造函数声明
  • LOCAL_VARIABLE:局部变量声明
  • ANNOTATION_TYPE:注释类型声明
  • PACKAGE:包声明
  • TYPE_PARAMETER:类型参数声明。该常量可以用于各种参数类型(包括类)的前面
  • TYPE_USE:类型的使用。该常量可以用来标注任何类型的名称,包括TYPE_PARAMETER

所以我们可以根据我们的需要选择此处的常量,当然可以多选

例如这样,按照图片的写法,这个@annotationT就既可以声明在字段上,又可以声明在方法上。

@Inherited

如图可见,这个注解是一个可以被文档生成工具显示,不会被编译器、JVM丢弃,且用到了ANNOTATION_TYPE,也就是说这个注解只能定义到注解上,所以他一定是用来规定注解的某些特性的。

老样子我们翻译一下上边的注释,由于篇幅较长此处不展示具体内容,大佬们可以点进去看看,大概是:被这个注解注释的注解可以自动继承的,查询类上的注解类型,如果类声明没有针对该类型的注解将自动查询超类(直到Object)

PS:请注意,如果注解类型用于注解类以外的任何内容,则此元注解类型无效。还要注意,此元注解只会导致注解从超类继承;已实现接口上的注解没有影响。

简单说,如果想让你定义的注解被继承,那就把@Inherited挂在你的注解上

总结

以上就是作用于我们所有注解上的元注解的基本信息,我们明白每个元注解代表什么意思会方便我们去理解一些JDK自带的、或者第三方类库中定义或使用的注解,也会方便我们自己去定义一些注解,比如可以用注解的方式实现在操作我们自定义的注解注释的方法执行之前或者之后要做些什么,当我们真正会使用这些元注解去自定义属于自己的注解的时候,一定会理解为什么注解使用的如此普遍。

感谢各位大佬的阅读ORZ,如果能帮到你是我的幸运,如果本篇博客有任何问题欢迎留言指出,谢谢~

Java元注解介绍的更多相关文章

  1. 使用Java元注解和反射实现简单MVC框架

    Springmvc的核心是DispatcherServlet来进行各种请求的拦截,进而进行后续的各种转发处理.流程图如下: 说明:客户端发出一个http请求给web服务器,web服务器对http请求进 ...

  2. Java元注解@Retention规则

    @Retention是java当中的一个元注解,该元注解通常都是用于对软件的测试 1.适用方式:     @Retention(RetentionPolicy.RUNTIME)     @interf ...

  3. Spring注解与Java元注解小结

    注解 Annotation 基于注解的开发,使得代码简洁,可读性高,简化的配置的同时也提高了开发的效率,尤其是SpringBoot的兴起,随着起步依赖和自动配置的完善,更是将基于注解的开发推到了新的高 ...

  4. Java元注解—— @Retention @Target @Document @Inherited

    java中元注解有四个: @Retention @Target @Document @Inherited: @Retention:注解的保留位置 @Retention(RetentionPolicy. ...

  5. Java 元注解

    元注解@Target,@Retention,@Documented,@Inherited * * @Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括: * Elemen ...

  6. Java元注解

    元注解是指注解的注解,包括@Retention @Target @Document @Inherited四种. 1.@Retention: 定义注解的保留策略@Retention(RetentionP ...

  7. java元注解(注解在注解上的注解)

    //ElementType.TYPE 给类.接口.枚举上使用 @Target(ElementType.TYPE)//给注解进行注解,表示该注解可以用在什么地方 //@Retention(Retenti ...

  8. java元注解 @Retention注解使用

    @Retention定义了该Annotation被保留的时间长短: 1.某些Annotation仅出现在源代码中,而被编译器丢弃: 2.另一些却被编译在class文件中,注解保留在class文件中,在 ...

  9. java元注解 @Target注解用法

    @Target: @Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages.types(类.接口.枚举.Annotation类型).类型成员(方法.构造 ...

  10. Java元注解,简单案例

    [注解] 程序中有 注释 和注解 * 注释:给开发人员. * 注解:给计算机看的. 注解使用:学习框架支持注解开发. [JDK提供的注解] @Override :描述方法的重写. @SuppressW ...

随机推荐

  1. STM32 CubeMX 学习:002-外部中断的使用

    背景 上一讲 STM32 CubeMX 学习:GPIO的使用 介绍了如何配置以及操作GPIO引脚. 这一讲我们通过中断来控制按键.关于中断的概念不做介绍. HOST-OS : Windows-10 S ...

  2. frp内网穿透:基于centos8 云服务器和debian12客户端服务器

    前言 入了一台本地工控机盒子,刷成了debian12系统,性能比云服务器要好一点,现在想要远程访问这台盒子,但是盒子又没有公网地址,所以想通过内网穿透的方式,通过云服务器转发请求实现内网穿透.原来体验 ...

  3. 3款C#开源且实用的工具类库,工作效率提升利器!

    前言 在日常工作开发中工具类库是软件开发中不可或缺的一部分,它们通过提供代码重用.通用功能.隐藏复杂性.提高代码质量.扩展性等方面的优势,帮助开发者更高效.更稳定地构建软件应用程序.今天大姚给大家分享 ...

  4. VulnHub_DC-1渗透流程

    DC-1 DC-1 是一个专门建造的易受攻击的实验室,目的是在渗透测试领域获得经验. 它旨在为初学者提供挑战,但它的难易程度取决于您的技能和知识,以及您的学习能力. 要成功完成此挑战,您将需要 Lin ...

  5. 解决方案 | vba批量冻结首行,所有sheet一次性设置

    Sub FreezeTopRowAllSheets() Dim ws As Worksheet ' 遍历所有工作表 For Each ws In ThisWorkbook.Worksheets ' 激 ...

  6. 【解决方案】智能UI自动化测试

    你的UI自动化追得上业务的变更和UI更迭吗?当今瞬息万变的时代,成千上万的App围绕着现代人生活的点点滴滴.为了满足用户的好的体验和时刻的新鲜感,这些App需要时刻保持变化,也给 UI自动化落地实施带 ...

  7. IP协议学习笔记

    目录 IP地址格式 IP分类 CIDR 和 子网掩码介绍 NAT+公网.私网地址 CIDR 与 VLSM VLSM 子网划分案例 练习 Reference IP的作用类似物理世界中的地址,用于定位机器 ...

  8. TokenObtainPairSerialize

    TokenObtainPairSerializer是Django REST framework的SimpleJWT库提供的序列化器.它用于对用户凭据(如用户名和密码)进行序列化和验证,并在成功的身份验 ...

  9. 变频器通过Modbus转Profinet网关接电机与PLC通讯在自动化的应用

    巴图自动化Profinet转Modbus模块(BT-MDPN10)是一种用于不同通讯协议之间互连的设备,它可以将Profinet与Modbus这两种不同的通讯协议进行转换,从而实现设备之间的通讯和数据 ...

  10. 如何立刻读取在MySQL中自动生成的主键

    在写一个接口时,我们需要对两个表分别动刀,但是我们需要前一个表的主键作为下一个表的功能外键, 如果使用mybatisplus,insert完成之后便可以直接在对象中取出这个id值 如果使用mybati ...