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所有通知
通过广播接收方式,根据包名关闭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 通信三大步骤: 1 三次握手建立连接; 2 开始通信,进行数据交换; 3 四次挥手断开连接; 一、TCP内部原理--三次握手 【第一次握手】套接字A∶"你好,套接字B。我这儿有数据要传给你,建立连接吧。" 【第二次…...
力扣100题--移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […...
Spring 邮件发送
Spring 邮件发送 1. 主要内容(了解) 2. JavaMail 概述(了解) JavaMail,顾名思义,提供给开发者处理电⼦邮件相关的编程接⼝。JavaMail 是由 Sun 定义的⼀套收发电⼦邮件的 API,它可以⽅便地执⾏⼀…...
利用 360 安全卫士极速版关闭电脑开机自启动软件教程
在使用电脑的过程中,过多的开机自启动软件会严重拖慢电脑的开机速度,影响我们的使用体验。本教程中简鹿办公将详细介绍如何使用 360 安全卫士极速版关闭电脑开机自启动软件,让您的电脑开机更加迅速流畅。 一、打开 360 安全卫士极速版 在电…...
楼房销售系统
文末获取源码和万字论文,制作不易,感谢点赞支持。 毕 业 设 计(论 文) 题目:楼房销售系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储…...
UML箭线图的理解和实践
在软件开发的世界里,UML(统一建模语言)作为一种标准化的建模语言,扮演着举足轻重的角色。UML类图更是软件开发设计和架构过程中的核心工具,它不仅能帮助开发者明确系统中的类及其关系,还能为后续的代码实现…...
Qt入门8——Qt文件
1. Qt文件概述 文件操作是应用程序必不可少的部分。Qt作为⼀个通用开发库,提供了跨平台的文件操作能力。Qt 提供了很多关于文件的类,通过这些类能够对文件系统进行操作,如文件读写、文件信息获取、文件复制或重命名等。 2. 输入输出设备类 在…...
鸿翼受邀出席2024海峡两岸档案暨缩微学术交流会
近日,由中国档案学会、中国文献影像技术协会共同主办,中华档案暨资讯微缩管理学会参加的2024年海峡两岸档案暨缩微学术交流会在乌鲁木齐召开。鸿翼联合创始人兼CTO罗永秀受邀出席本次交流会并作主题分享。 自1992年以来,该学术交流会已连续举…...
支持win7系统的onnxruntime
在win7 X86系统上,使用了onnxruntime.dll库做AI识别,但是在win7上运行报0xc0000005的错误 经查,ONNX Runtime从v1.15.0版本开始不再支持Windows 7及其之前的操作系统,即便尝试重新编译源代码亦无法在这些老系统上运行,…...
如何利用内链策略提升网站的整体权重?
内链是谷歌SEO中常常被低估的部分,实际上,合理的内链策略不仅能帮助提升页面间的关联性,还可以增强网站的整体权重。通过正确的内链布局,用户可以更流畅地浏览你的网站,谷歌爬虫也能更快地抓取到更多页面,有…...
鸿蒙分享(二):引入zrouter路由跳转+封装
码仓库:https://gitee.com/linguanzhong/share_harmonyos 鸿蒙api:12 鸿蒙第三方库地址:OpenHarmony三方库中心仓 zrouter地址:OpenHarmony三方库中心仓 1.引入zrouter 1.打开终端界面:输入 ohpm install hzw/zrouter 2.在项目…...
【计算机网络】实验11:边界网关协议BGP
实验11 边界网关协议BGP 一、实验目的 本次实验旨在验证边界网关协议(BGP)的实际作用,并深入学习在路由器上配置和使用BGP协议的方法。通过实验,我将探索BGP在不同自治系统之间的路由选择和信息交换的功能,理解其在互…...
leetcode 1853 转换日期格式(postgresql)
需求 表: Days ----------------- | Column Name | Type | ----------------- | day | date | ----------------- day 是这个表的主键。 给定一个Days表,请你编写SQL查询语句,将Days表中的每一个日期转化为"day_name, month_name day, year"…...
掌握时间,从`datetime`开始
文章目录 掌握时间,从datetime开始第一部分:背景介绍第二部分:datetime库是什么?第三部分:如何安装这个库?第四部分:简单库函数使用方法1. 获取当前日期和时间2. 创建特定的日期3. 计算两个日期…...
剖析千益畅行,共享旅游-卡,合规运营与技术赋能双驱下的旅游新篇
在数字化浪潮席卷各行各业的当下,旅游产业与共享经济模式深度融合,催生出旅游卡这类新兴产品。然而,市场乱象丛生,诸多打着 “共享” 幌子的旅游卡弊病百出,让从业者与消费者都深陷困扰。今天,咱们聚焦技术…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
