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. Oracle常用统计

    测试, 这是测消息 1.按天 select to_char(t.STARTDATE+15/24, 'YYYY-MM-DD') as 天,sum(1) as 数量from HOLIDAY tgroup ...

  2. python基础-数据容器的通用操作

    五种数据容器的特性   列表list[]  元组tuple()  字符串str""   集合set{}   字典dict{key:value} 元素数量 支持多个 支持多个 支持多 ...

  3. Apifox 6月更新|定时任务、内网自部署服务器运行接口定时导入、数据库 SSH 隧道连接

    Apifox 新版本上线啦!!! 看看本次版本更新主要涵盖的重点内容,有没有你所关注的功能特性: 自动化测试支持设置「定时任务」  支持内网自部署服务器运行「定时导入」 数据库均支持通过 SSH 隧道 ...

  4. java WT -- JSON WEB TOKEN 加密/校验工具类

    依赖项 <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</art ...

  5. Mybatis xxxMapper.xml 三表关联,配置文件

    VideoMapper.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mappe ...

  6. MobaXterm是一款功能强大的远程SSH利器,是您远程计算机的终极工具箱

    MobaXterm 是一款功能强大的远程终端应用,可以用于 Windows 系统上的 SSH.Telnet.RDP.VNC 等远程登录.它支持多种会话类型,拥有强大的终端功能,还支持 X11 图形界面 ...

  7. 【算法】在vue3的ts代码中分组group聚合源数据列表

    有一个IList<any>()对象列表, 示例数据为[{id:'1',fieldName:'field1',value:'1'},{id:'1',fieldName:'field2',va ...

  8. webpack4.15.1 学习笔记(六) — 代码拆分(Code Splitting)

    目录 入口起点 防止重复 动态导入(dynamic imports) 代码拆分能够将代码分离到不同的 bundle 中,然后可以按需加载或并行加载这些文件.代码拆分可以用于获取更小的 bundle,以 ...

  9. AngleScript语法

    Class的使用要继承于Interface或者Mixin class.Mixinclass实际上就是类似于抽象类 ,它已经实现的,在子类里面不能实现,类似如下代码: interface AInterf ...

  10. Goutte爬虫

    安装 composer require fabpot/goutte:4.0