Java元注解介绍
Java四种元注解相关介绍
概述
注解从Java1.5
引入以来,不断地简化我们编写代码的流程,逐渐的也成为了我们必学的一项技术。我们学习了各种注解,学习了他们的用法,学习了他们的限制,是否想过他们的组成呢,下面我将我对元注解的理解分享给大家。
元注解是用来修饰注解的注解,在java.lang.annotation
包下,当我们需要自己定义一个注解去做某些事情的时候,我们要对该注解进行一些限制,确保我们注解的作用域,有的注解有属性,有的注解没有属性,我们点进去就能看到。这样的注解一共有四个,如下图
定义一个注解用@interface
来修饰文件类型,这四个元注解我们一个一个分析
@Documented
该注解是用来声明,我们的注解是否能被Javadoc
等API
文档生成工具展示出来,如果某个注解上面声明了@Documented
,就说明这个注解可以被那些生成文档的工具展示出来。
我们点进去可以看到,该注解用到了三个注解,其中有他自己,还有两个元注解,并且这个注解没有属性,所以我们的使用方法很简单,就是写或者不写该注解。
@Retention
我们点进这个注解可以看到,首先他写了@Documented
,说明他是可以被文档生成工具显示到文档中,并且他有一条属性,他同样也对自己使用了@Retention
,并且给了一个值->RetentionPolicy.RUNTIME
,可以看到跟我们上边的@Documented
注解是一样的,然后我们点到RetentionPolicy
这个类中去看看这个位置都可以给什么值
首先我们注意到了,这个类是个枚举类,也就是说我们还可以这样写
那么这三个常量都代表什么意思呢
- SOURCE:我们翻译一下注释:编译器将丢弃注解就是说如果用了他,那么你的注解编译成
.class
文件之后就会被丢掉,所以如果我们的注解是用来辅助编译过程的,那么我们可以用它。
例如
@SuppressWarnings
,我们通常用该注解来告诉编译器忽略某些警告信息,编译之后我们就不需要了,所以这个场景用SOURCE肯定是没毛病的
- CLASS:我们翻译一下注释:编译器将注解记录在类文件中,
VM
在运行时不需要保留这些注释。这是默认设置行为。也就是说,编译器编译成.class
文件后,这个注解仍然存在,但是在我们的jvm
去加载.class
文件的时候会被丢掉,这个使用的不多所以我们知道这个是什么意思就行。如果不写,默认就是选择CLASS
。 - RUNTIME:使用率最高的一个常量,随便去某个类库里去查一下注解,点进去基本都是RUNTIME。老样子,我们先翻译注释:注释将由编译器记录在类文件中,并在运行时由
VM
定义,因此可以反射性地读取。也就是说这个常量所定义的范围是最大的了,都可以被反射了,也就是不光编译器编译了、JVM
加载了还能反射性的读取到,会一直存在。我们自己在定义注解的时候,除非有特殊需要,一般业务也是用这个常量,比较方便一些。
@Target
由图可以看到,这个元注解用到了三个元注解,有我们上边说的两个和他自己。此处我们不过多赘述。再看他的属性,可以看到用到了中括号,说明注解的参数这里是可以放一个枚举数组的,我们点开枚举后可以看到声明了很多常量。
老样子先翻译一下注释,基本都能看出来是啥意思了,TYPE_PARAMETER
和TYPE_USE
是JDK1.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元注解介绍的更多相关文章
- 使用Java元注解和反射实现简单MVC框架
Springmvc的核心是DispatcherServlet来进行各种请求的拦截,进而进行后续的各种转发处理.流程图如下: 说明:客户端发出一个http请求给web服务器,web服务器对http请求进 ...
- Java元注解@Retention规则
@Retention是java当中的一个元注解,该元注解通常都是用于对软件的测试 1.适用方式: @Retention(RetentionPolicy.RUNTIME) @interf ...
- Spring注解与Java元注解小结
注解 Annotation 基于注解的开发,使得代码简洁,可读性高,简化的配置的同时也提高了开发的效率,尤其是SpringBoot的兴起,随着起步依赖和自动配置的完善,更是将基于注解的开发推到了新的高 ...
- Java元注解—— @Retention @Target @Document @Inherited
java中元注解有四个: @Retention @Target @Document @Inherited: @Retention:注解的保留位置 @Retention(RetentionPolicy. ...
- Java 元注解
元注解@Target,@Retention,@Documented,@Inherited * * @Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括: * Elemen ...
- Java元注解
元注解是指注解的注解,包括@Retention @Target @Document @Inherited四种. 1.@Retention: 定义注解的保留策略@Retention(RetentionP ...
- java元注解(注解在注解上的注解)
//ElementType.TYPE 给类.接口.枚举上使用 @Target(ElementType.TYPE)//给注解进行注解,表示该注解可以用在什么地方 //@Retention(Retenti ...
- java元注解 @Retention注解使用
@Retention定义了该Annotation被保留的时间长短: 1.某些Annotation仅出现在源代码中,而被编译器丢弃: 2.另一些却被编译在class文件中,注解保留在class文件中,在 ...
- java元注解 @Target注解用法
@Target: @Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages.types(类.接口.枚举.Annotation类型).类型成员(方法.构造 ...
- Java元注解,简单案例
[注解] 程序中有 注释 和注解 * 注释:给开发人员. * 注解:给计算机看的. 注解使用:学习框架支持注解开发. [JDK提供的注解] @Override :描述方法的重写. @SuppressW ...
随机推荐
- 开源GTKSystem.Windows.Forms,在这里更新预告
开源GTKSystem.Windows.Forms,在这里更新预告 gitee码云开源地址:https://gitee.com/easywebfactory/gtksystem-windows-for ...
- yb课堂 新版Vue+脚手架Vue-Cli 4.3安装 《二十七》
本地搭建Vue.CLI.Cube-UI相关框架 什么是Vue 一套用于构建用户界面的渐进式框架.与其他大型框架不同的是,Vue被设计为可以自底向上逐层应用.Vue的核心库只关注视图层,不仅易于上手,还 ...
- Vue源码学习(二十):$emit、$on实现原理
好家伙, 0.一个例子 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset= ...
- Pytorch功能库留存
初始化 首先,介绍我们导入的包和基础的网络结构 import torch import torch.nn as nn #可替代网络结构部分 ''' 神经网络类的定义 1. 输入卷积: in_chann ...
- mysql数据库无法录入汉字问题
1.插入数据出现错误 show full columns from 表名;//查看数据表列编码 2. alter table 表名 change 列名 列名 varchar(自己设置) charact ...
- python的Faker使用
import json from faker import Faker from faker_demo.CustomFaker import CustomProvider myfaker = Fake ...
- Jmeter固定定时器
固定定时器(Constant Timer),每个线程在请求之间暂停相同的时间.时间单位是毫秒,1000毫秒=1秒 组件路径:线程组->右键添加->定时器->固定定时器 1.固定定时器 ...
- SemanticKernel/C#:使用Ollama中的对话模型与嵌入模型用于本地离线场景
前言 上一篇文章介绍了使用SemanticKernel/C#的RAG简易实践,在上篇文章中我使用的是兼容OpenAI格式的在线API,但实际上会有很多本地离线的场景.今天跟大家介绍一下在Semanti ...
- 【Java】三元运算符 类型提升 问题
代码片段: @Test public void test() { Object o = true ? new Integer(1) : new Double(2); System.out.printl ...
- 【Java】JDBC Part5 DataSource 连接池操作
JDBC Part5 DataSource 连接池操作 - javax.sql.DataSource 接口,通常由服务器实现 - DBCP Tomcat自带相对C3P0速度较快,但存在BUG,已经不更 ...