当前位置: 首页 > news >正文

java注解(一):什么是注解?什么是元注解?如何自定义注解?注解的原理是什么?

目录

1、什么是注解?

2、什么是元注解

1、@Target()

2、@Retention()

3、@Documented

4、@Inherited

3、如何自定义注解以解使用

4、注解的原理


本篇文章主要是介绍注解的概念、原理,以及通过代码演示4种元注解、如何自定义注解。通过反编译的形式进一步认识注解的本质。

1、什么是注解?

注释是给人看的,注解是给程序看的

例如我们常见的单元测试@Test注解,实现父类方法的@Override注解

2、什么是元注解

元注解就是负责修饰其他注解的注解

java定义了四种,主要是用于规范当前注解的作用范围,注解生命周期等。

分为@Target()、@Retention()、@Documented、@Inherited

其中@Target()、@Retention()是用得比较多的。

1、@Target()

需要带参数,表示规范这个注解可以用在类上,或者方法等其他地方上。

ElementType这个枚举类定义了很多类型,根据不同类型的定义决定被修饰的注解的使用地方

//表示我们的注解可以用在哪些地方,可以进源码查看
@Target(value = {ElementType.METHOD})

ElementType的类型如下

2、@Retention()

需要带参数,表示注解在什么地方还有效,描述注解的生命周期。有3种情况

SOURCES:只作用在源码阶段,字节码文件种不存在

CLASS:保留到字节码文件阶段,运行阶段不存在

RUNTIME:运行时有效,开发常用

RUNTIME>CLASS>SOURCES

//表示注解在什么地方还有效,一般就3种情况。RUNTIME>CLASS>SOURCES
@Retention(value = RetentionPolicy.RUNTIME)

3、@Documented

表示是否将我们的注解生成在javaDoc中

@Documented

4、@Inherited

说明子类可以继承父类中的该注解

@Inherited

3、如何自定义注解以解使用

以下是自定义一个metaAnnotation注解

自定义注解里面的属性必须要带括号

下面拆分为几种形式学习

情况一:注解值属性为value,且仅有一个属性时,使用该注解可以省略命名

@Target(value = {ElementType.METHOD})//表示该注解是定义在方法上的
@Retention(value = RetentionPolicy.RUNTIME)  //表示该注解生命周期为运行时有效
public @interface metaAnnotation{//自定义注解,记得加括号String value();  //为value时,注解可以省略命名}

使用方法

@metaAnnotation("value时可以省略命名,只有这个可以,不成名的规范")public static void main(String[] args) {}

情况二:设置默认值的注解,使用时候可以选择不命名以及不传参数。

@Target(value = {ElementType.METHOD})//表示该注解是定义在方法上的
@Retention(value = RetentionPolicy.RUNTIME)  //表示该注解生命周期为运行时有效
public @interface metaAnnotation{//自定义注解,记得加括号int id() default 1;int index() default -1;  //如果默认值为-1,代表不存在}

使用方法

@metaAnnotation()
public static void main(String[] args) {
}

情况三:多参数定义注解,属性为value的必须要命名传参,

其他属性的无默认值的也必须要命名传参,

设置了默认值的属性也可以选择传参,

参数也可以为数组的方式

@Target(value = {ElementType.METHOD})//表示该注解是定义在方法上的
@Retention(value = RetentionPolicy.RUNTIME)  //表示该注解生命周期为运行时有效
public @interface metaAnnotation{//自定义注解,记得加括号String value();  //为value时,注解可以省略命名int id() default 1;int index() default -1;  //如果默认值为-1,代表不存在String name();int age();String[] nameList();
}

使用方法

  @metaAnnotation(value = "value时可以省略命名,只有这个可以,不成名的规范",index = 1,name = "名字",age = 99,nameList = {"名字1","名字1"})public static void main(String[] args) {}

4、注解的原理

注解的本质:

就是一个接口,java中所有的注解都继承了Annotation接口。

我们使用注解@注解(...)的时候其实就是一个实现类对象,实现了该注解以及Annotation接口 

先把注解编译成class再反编译,还是以我们自定义的注解举例子

@Target(value = {ElementType.METHOD})//表示该注解是定义在方法上的
@Retention(value = RetentionPolicy.RUNTIME)  //表示该注解生命周期为运行时有效
public @interface metaAnnotation{//自定义注解,记得加括号String value();  //为value时,注解可以省略命名int id() default 1;int index() default -1;  //如果默认值为-1,代表不存在String name();int age();
}

以下是反编译后注解真正的源代码

我们可以看到,我们写的注解的本质是一个接口,继承了Annotation的接口

我们在注解里面自定义的属性,其实都是抽象方法的形式

当我们使用注解的时候,实际上就相当于创建注解的实现类对象,这个实现类对象会封装注解的属性信息(比如value的值,index的值,name的值等),封装进去之后,我们就可以通过这个对象去调用注解提供的方法来获取对应的属性值。

以上就是我对注解的理解啦,希望能帮到大家,有问题的地方欢迎大家一起讨论!

后续会不断更新作品,欢迎大家一起讨论学习。❤❤❤

相关文章:

java注解(一):什么是注解?什么是元注解?如何自定义注解?注解的原理是什么?

目录 1、什么是注解? 2、什么是元注解 1、Target() 2、Retention() 3、Documented 4、Inherited 3、如何自定义注解以解使用 4、注解的原理 本篇文章主要是介绍注解的概念、原理,以及通过代码演示4种元注解、如何自定义注解。通过反编译的形式进…...

AD20 原理图库更新到原理图

一 点击工具,从库更新。快捷键TL 二 点击完成 三 执行变更,最后点击关闭...

.NET用C#导入Excel数据到数据库

将Excel文件中的数据导入到数据库中不仅能够提升数据处理的效率和准确性,还能极大地促进数据分析和决策制定的过程。尤其在企业级应用中,Excel作为数据输入和初步整理的工具非常普遍,但其功能对于复杂查询、大规模数据管理和跨部门的数据共享…...

小身躯大能量-供热系统通过EtherCAT转Profinet网关进行升级

在现代工业自动化领域,通信技术的进步对于提高系统效率、稳定性和可靠性起着至关重要的作用。EtherCAT(Ethernet for Control Automation Technology)作为一种实时以太网解决方案,因其高性能及成本效益高等特点,在众多…...

Android11.0系统关闭App所有通知

通过广播接收方式&#xff0c;根据包名关闭App所有通知。 packages/apps/Settings$ git diff diff --git a/AndroidManifest.xml b/AndroidManifest.xml index d4c54c6ed8..1ce7d4136f 100644 --- a/AndroidManifest.xmlb/AndroidManifest.xml-106,6 106,7 <uses-permissio…...

# issue 8 TCP内部原理和UDP编程

TCP 通信三大步骤&#xff1a; 1 三次握手建立连接; 2 开始通信&#xff0c;进行数据交换; 3 四次挥手断开连接&#xff1b; 一、TCP内部原理--三次握手 【第一次握手】套接字A∶"你好&#xff0c;套接字B。我这儿有数据要传给你&#xff0c;建立连接吧。" 【第二次…...

力扣100题--移动零

给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […...

Spring 邮件发送

Spring 邮件发送 1. 主要内容&#xff08;了解&#xff09; 2. JavaMail 概述&#xff08;了解&#xff09; JavaMail&#xff0c;顾名思义&#xff0c;提供给开发者处理电⼦邮件相关的编程接⼝。JavaMail 是由 Sun 定义的⼀套收发电⼦邮件的 API&#xff0c;它可以⽅便地执⾏⼀…...

利用 360 安全卫士极速版关闭电脑开机自启动软件教程

在使用电脑的过程中&#xff0c;过多的开机自启动软件会严重拖慢电脑的开机速度&#xff0c;影响我们的使用体验。本教程中简鹿办公将详细介绍如何使用 360 安全卫士极速版关闭电脑开机自启动软件&#xff0c;让您的电脑开机更加迅速流畅。 一、打开 360 安全卫士极速版 在电…...

楼房销售系统

文末获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;楼房销售系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xf…...

UML箭线图的理解和实践

在软件开发的世界里&#xff0c;UML&#xff08;统一建模语言&#xff09;作为一种标准化的建模语言&#xff0c;扮演着举足轻重的角色。UML类图更是软件开发设计和架构过程中的核心工具&#xff0c;它不仅能帮助开发者明确系统中的类及其关系&#xff0c;还能为后续的代码实现…...

Qt入门8——Qt文件

1. Qt文件概述 文件操作是应用程序必不可少的部分。Qt作为⼀个通用开发库&#xff0c;提供了跨平台的文件操作能力。Qt 提供了很多关于文件的类&#xff0c;通过这些类能够对文件系统进行操作&#xff0c;如文件读写、文件信息获取、文件复制或重命名等。 2. 输入输出设备类 在…...

鸿翼受邀出席2024海峡两岸档案暨缩微学术交流会

近日&#xff0c;由中国档案学会、中国文献影像技术协会共同主办&#xff0c;中华档案暨资讯微缩管理学会参加的2024年海峡两岸档案暨缩微学术交流会在乌鲁木齐召开。鸿翼联合创始人兼CTO罗永秀受邀出席本次交流会并作主题分享。 自1992年以来&#xff0c;该学术交流会已连续举…...

支持win7系统的onnxruntime

在win7 X86系统上&#xff0c;使用了onnxruntime.dll库做AI识别&#xff0c;但是在win7上运行报0xc0000005的错误 经查&#xff0c;ONNX Runtime从v1.15.0版本开始不再支持Windows 7及其之前的操作系统&#xff0c;即便尝试重新编译源代码亦无法在这些老系统上运行&#xff0c;…...

如何利用内链策略提升网站的整体权重?

内链是谷歌SEO中常常被低估的部分&#xff0c;实际上&#xff0c;合理的内链策略不仅能帮助提升页面间的关联性&#xff0c;还可以增强网站的整体权重。通过正确的内链布局&#xff0c;用户可以更流畅地浏览你的网站&#xff0c;谷歌爬虫也能更快地抓取到更多页面&#xff0c;有…...

鸿蒙分享(二):引入zrouter路由跳转+封装

码仓库&#xff1a;https://gitee.com/linguanzhong/share_harmonyos 鸿蒙api:12 鸿蒙第三方库地址&#xff1a;OpenHarmony三方库中心仓 zrouter地址&#xff1a;OpenHarmony三方库中心仓 1.引入zrouter 1.打开终端界面&#xff1a;输入 ohpm install hzw/zrouter 2.在项目…...

【计算机网络】实验11:边界网关协议BGP

实验11 边界网关协议BGP 一、实验目的 本次实验旨在验证边界网关协议&#xff08;BGP&#xff09;的实际作用&#xff0c;并深入学习在路由器上配置和使用BGP协议的方法。通过实验&#xff0c;我将探索BGP在不同自治系统之间的路由选择和信息交换的功能&#xff0c;理解其在互…...

leetcode 1853 转换日期格式(postgresql)

需求 表: Days ----------------- | Column Name | Type | ----------------- | day | date | ----------------- day 是这个表的主键。 给定一个Days表&#xff0c;请你编写SQL查询语句&#xff0c;将Days表中的每一个日期转化为"day_name, month_name day, year"…...

掌握时间,从`datetime`开始

文章目录 掌握时间&#xff0c;从datetime开始第一部分&#xff1a;背景介绍第二部分&#xff1a;datetime库是什么&#xff1f;第三部分&#xff1a;如何安装这个库&#xff1f;第四部分&#xff1a;简单库函数使用方法1. 获取当前日期和时间2. 创建特定的日期3. 计算两个日期…...

剖析千益畅行,共享旅游-卡,合规运营与技术赋能双驱下的旅游新篇

在数字化浪潮席卷各行各业的当下&#xff0c;旅游产业与共享经济模式深度融合&#xff0c;催生出旅游卡这类新兴产品。然而&#xff0c;市场乱象丛生&#xff0c;诸多打着 “共享” 幌子的旅游卡弊病百出&#xff0c;让从业者与消费者都深陷困扰。今天&#xff0c;咱们聚焦技术…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...