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. 全国产!全志T3+Logos FPGA核心板(4核ARM Cortex-A7)规格书

    核心板简介 创龙科技SOM-TLT3F是一款基于全志科技T3四核ARM Cortex-A7处理器 + 紫光同创Logos PGL25G/PGL50G FPGA设计的异构多核全国产工业核心板,ARM C ...

  2. 新知识get,vue3是如何实现在style中使用响应式变量?

    前言 vue2的时候想必大家有遇到需要在style模块中访问script模块中的响应式变量,为此我们不得不使用css变量去实现.现在vue3已经内置了这个功能啦,可以在style中使用v-bind指令 ...

  3. 搜索Python编程获取相关图书信息

    1.获取相关图书信息 #搜索"Python编程"获取相关图书信息 from selenium import webdriver from selenium.webdriver.su ...

  4. [oeasy]python0119_语言的演化_拉丁字符_罗马帝国_罗马体

    罗马拉丁字符 回忆上次内容 起源于埃及的 圣书体 象形文字 在与 两河流域的 苏美尔楔形文字 结合后 经过 腓尼基人 的拼音化 和 广泛传播 终于来到了 希腊   ​   添加图片注释,不超过 140 ...

  5. oeasy教您玩转vim - 87 - # 内容查找grep命令

    ​ 内容查找 grep 回忆 上次我们尝试了一下各种在vi中执行外部程序 可以排序 可以改大小写 还可以用管道 直接对于缓冲buffer文件进行操作 还是很方便的 其实还有一个外部命令很重要 根据内容 ...

  6. MySQL 实现 EF Code First TimeStamp/RowVersion 并发控制

    在将项目迁移到MySQL 5.6.10数据库上时,遇到和迁移到PostgreSQL数据库相同的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Serv ...

  7. Linux 手工释放Linux Cache Memory

    手工释放Linux Cache Memory 为了加速操作和减少磁盘I/O,内核通常会尽可能多地缓存内存,这部分内存就是Cache Memory(缓存内存).根据设计,包含缓存数据的页面可以按需重新用 ...

  8. 【SpringBoot】04 初探YAML与配置

    什么是YAML? https://www.cnblogs.com/mindzone/p/12849789.html 复合结构的语法 一个标配JavaBean public class Person { ...

  9. 人形机器人的AI技术 —— 将一个大问题拆解为若干个小问题

    前文: 人形机器人 -- Figure 01机器人亮相 | OpenAI多模态能力加持 | 与人类流畅对话交互 | 具身智能的GPT-4时刻 所需的AI技术: 人形机器人的软件层面其实有: 视觉模块/ ...

  10. 【转载】 详解nohup /dev/null 2>&1 含义的使用

    原文地址: https://www.jb51.net/article/169837.htm ==================================== 这篇文章主要介绍了详解nohup ...