当前位置: 首页 > 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;咱们聚焦技术…...

Python 高级编程 014:isinstance 与 type 的核心差异

Python 高级编程 014&#xff1a;isinstance 与 type 的核心差异一、先明确&#xff1a;二者的核心定位差异二、实战代码&#xff1a;一眼看清区别1. 定义继承类2. 用 isinstance () 判断&#xff08;推荐&#xff09;3. 用 type () 判断&#xff08;易踩坑&#xff09;三、关键…...

Altium Designer 21 规则设置保姆级指南:从新手到老鸟,这些默认值千万别乱动

Altium Designer 21 规则设置实战精要&#xff1a;默认值的智慧与关键调整策略 作为一名从学生时代就开始使用Altium Designer的硬件工程师&#xff0c;我至今记得第一次打开规则设置面板时的眩晕感——密密麻麻的选项像是一道道关卡&#xff0c;让人既想全部征服又担心误操作导…...

告别“人工智障”:用LangChain和GPT-4打造你的第一个AI智能体(附保姆级代码)

从零构建智能体&#xff1a;LangChain与GPT-4实战指南 在咖啡厅角落&#xff0c;一位开发者正对着屏幕皱眉——她刚读完一篇关于AI代理的学术论文&#xff0c;满篇理论却找不到一行可执行的代码。这场景你是否熟悉&#xff1f;本文将用完全不同的方式&#xff0c;带你用LangCha…...

DiffuGen:基于扩散模型的代码生成技术原理与应用前景

1. 项目概述&#xff1a;当AI绘画遇上代码生成最近在GitHub上看到一个挺有意思的项目&#xff0c;叫CLOUDWERX-DEV/DiffuGen。光看名字&#xff0c;Diffu很容易让人联想到这两年火得不行的扩散模型&#xff08;Diffusion Model&#xff09;&#xff0c;而Gen则指向生成&#xf…...

共享麻将室无人化运营:技术架构、硬件选型与实战避坑指南

1. 项目概述&#xff1a;当传统棋牌室遇上“无人化”浪潮最近几年&#xff0c;如果你留意过城市里的商业形态&#xff0c;会发现一个挺有意思的现象&#xff1a;那些曾经需要前台、服务员、保洁阿姨的传统棋牌室&#xff0c;特别是麻将馆&#xff0c;正在悄然“变身”。它们门口…...

Python迭代器实战:构建高性能懒加载积分榜系统

1. 项目概述&#xff1a;从“可迭代”到“可控制”的数据流在Python的世界里&#xff0c;处理数据集合是家常便饭。无论是从数据库拉取用户列表&#xff0c;还是逐行读取一个巨大的日志文件&#xff0c;我们总在和各种序列打交道。但你是否想过&#xff0c;当你写下一个简单的f…...

手把手教你给咪咕盒子MGV2000刷机,S905L3芯片也能焕发新生(保姆级图文教程)

让老旧咪咕盒子重获新生的全流程刷机指南 前言&#xff1a;为什么我们需要给电视盒子刷机&#xff1f; 家里那台运营商赠送的咪咕MGV2000电视盒子&#xff0c;是不是已经让你忍无可忍了&#xff1f;开机慢得像老牛拉车&#xff0c;操作卡顿到让人抓狂&#xff0c;内置应用一大…...

CVE-2026-42897深度解析:Exchange零日XSS武器化全链条与企业防御实战指南

摘要&#xff1a;2026年5月14日&#xff0c;微软紧急披露Exchange Server高危零日漏洞CVE-2026-42897&#xff0c;该漏洞无需任何前置权限&#xff0c;仅通过一封恶意邮件即可在OWA界面触发任意JavaScript执行。截至5月19日&#xff0c;全球已有超过1200台Exchange服务器被观测…...

电钢琴初学者买琴不踩坑攻略:高性价比型号清单及避坑推荐

一、「绝对不能踩的坑」&#xff08;新手常犯的4个错误&#xff09; 1.预算陷阱&#xff1a;低于1000元的「玩具琴」不能买 1000元以下的电钢琴&#xff0c;大多是手感音色差、会毁手型&#xff0c;浪费钱。 2.键盘&#xff1a;必须选「88键逐级重锤配重」 电钢琴的核心是「…...

DPDK l2fwd性能调优手记:Hygon 8核+Intel X710网卡,从20G到满速的配置清单

DPDK l2fwd性能调优实战&#xff1a;Hygon 8核X710网卡突破10G瓶颈全记录 当我们在Hygon C86 3250八核处理器与Intel X710 10GbE网卡的硬件组合上部署DPDK l2fwd应用时&#xff0c;初始测试仅达到20Gbps的转发性能&#xff0c;远未达到硬件理论带宽。经过系统级的深度调优&…...