首页 > 编程语言 >Java元注解介绍

Java元注解介绍

时间:2024-08-27 22:04:54浏览次数:9  
标签:Java 声明 可以 介绍 编译器 注解 TYPE 我们

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,声明,可以,介绍,编译器,注解,TYPE,我们
From: https://www.cnblogs.com/zyyjgsj/p/18383625

相关文章

  • Java数据结构栏目总结
     目录数组与稀疏数组队列:自己用数组模拟Queue环形队列,取模【取余】实现.单链表(LinkList)双向链表(Next、Pre)单向环形链表线性结构数组与稀疏数组稀疏数组,很多0值,可用于压缩特点:共n+1行3列,n为不同值的个数(0除外)第一行:数组的行数、列数、不同值的个数第二行:行......
  • Java毕设项目II基于Spring Boot的医药管理系统的设计与实现
    目录一、前言二、技术介绍三、系统实现四、论文参考五、核心代码六、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末一、前言"在当今医疗信息化快速发展的背景下,设计......
  • 自我介绍+软工5问
    这个作业属于哪个课程 2024软工这个作业要求在哪里 第一次作业要求这个作业的目标 熟悉markdown,github,博客园自我介绍我是来自广州本地的学生。爱好运动,打游戏五个问题如何保证开发人员在工作中能真正获得提升?如何提升开发人员的效率?开发人员是否应该广涉略还是专精一个领......
  • Git组件介绍
    写在前面今天我们来学习一下Git。Git是一个分布式版本控制系统,用于跟踪文件的更改和管理多个版本的代码。#Git使用指南下载与安装下载GitforWindowsv2.46.0安装选择好路径,直接点击“下一步”完成安装即可。基本设置设置名称gitconfig--globaluser.name"Your......
  • 注解是如何实现的?
    注解是否支持继承不支持继承不能使用关键字extends来继承某个@interface,但注解在编译后,编译器会自动继承java.lang.annotation.Annotation接口.虽然反编译后发现注解继承了Annotation接口,但即使Java的接口可以实现多继承,但定义注解时依然无法使用extends关键字继承@interface。......
  • 自我介绍&软工5问
    这个作业属于哪个课程首页-计科22级12班-广东工业大学-班级博客-博客园(cnblogs.com)这个作业要求在哪里自我介绍+软工5问-作业-计科22级12班-班级博客-博客园(cnblogs.com)这个作业的目标熟悉博客的创作自我介绍我是广东工业大学22级计算机......
  • 注解的优点?元注解?
    介绍注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。主要作用如下:编写文档——通过注解中标识的元数据可以生成doc文档,这是最常见的,也是java最早提供的注解。常用的有@param@return等代码分析——通过......
  • 7.java面向对象
    面向过程&面向对象面向过程思想步骤清晰简单,第一步做什么,第二步做什么…...面对过程适合处理一些较为简单的问题。面向对象思想物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。......
  • 自我介绍+软工5问
    这个作业属于哪个课程计科22级12班这个作业要求在哪里作业这个作业的目标创建博客园和github并使用markdown发布随笔自我介绍我叫陈煜,是22级计科一班的学生。在大一大二参与过兴趣社团,也报名许多课外拓展活动,掌握了一定编程知识,通过了四六级。平日里我爱好......
  • Java 使用QQ邮箱的接收&发送功能,入门级教程
    进入qq邮箱主页面,点击账号下滑找到POP3...如果没有开启,需要开启,开启后,点击管理服务然后点击生成授权码按照步骤执行完成后,会给你需要的授权码1.拿到授权码后,导入相关依赖,和yml相关配置,注意修改配置文件的信息<dependency><groupId>org.apache.commons</......