Java 注解详解:RetentionPolicy 与 ElementType
文章目录
- 1. RetentionPolicy:注解的生命周期
- RetentionPolicy 的详细说明
- SOURCE 示例
- CLASS 示例
- RUNTIME 示例
- 2. ElementType:注解的应用范围
- ElementType 的详细说明
- ElementType 示例
- 用于类
- 用于方法
- 用于局部变量
- 3. RetentionPolicy 与 ElementType 的结合应用
- 案例:开发一个运行时注解
- 实现步骤
- 运行结果
- 4. 总结与扩展
- 总结
- 扩展
Java 的注解机制是代码元数据的一种强大表达形式,它能够在编译期或运行期为程序添加信息,并通过工具或框架加以利用。其中,
RetentionPolicy
和
ElementType
是 Java 注解体系中的两个核心组成部分,决定了注解的生命周期和适用范围。
本文将深入解读 RetentionPolicy
和 ElementType
的作用及其使用场景,帮助开发者全面掌握注解的基础与高级应用。
1. RetentionPolicy:注解的生命周期
RetentionPolicy
定义了注解的保留策略,决定了注解在源代码、字节码或运行时的可用性。以下是 RetentionPolicy
的源码定义:
package java.lang.annotation;public enum RetentionPolicy {/** 注解只保留在源代码中,编译后将被丢弃。 */SOURCE,/** 注解保留在字节码中,但运行时不可见(默认策略)。 */CLASS,/** 注解保留在字节码中,且运行时可通过反射获取。 */RUNTIME
}
RetentionPolicy 的详细说明
值 | 描述 |
---|---|
SOURCE | 注解只存在于源代码中,编译后会被丢弃。适用于编译期工具,例如代码生成器。 |
CLASS | 注解会记录到字节码中,但 JVM 在运行时无法访问。默认策略,适用于不需要运行时处理的场景。 |
RUNTIME | 注解会记录到字节码中,且在运行时通过反射可见。适用于需要运行时动态处理的注解,例如 Spring 框架。 |
SOURCE 示例
用于生成代码或编译时检查:
@Retention(RetentionPolicy.SOURCE)
@interface SourceAnnotation {}
CLASS 示例
默认策略,多用于标记类信息:
@Retention(RetentionPolicy.CLASS)
@interface ClassAnnotation {}
RUNTIME 示例
常见于依赖运行时反射的框架:
@Retention(RetentionPolicy.RUNTIME)
@interface RuntimeAnnotation {}
2. ElementType:注解的应用范围
ElementType
定义了注解可以应用的目标类型,例如类、方法、字段等。其源码如下:
package java.lang.annotation;public enum ElementType {TYPE, // 类、接口(包括注解类型)或枚举声明FIELD, // 字段声明(包括枚举常量)METHOD, // 方法声明PARAMETER, // 方法参数声明CONSTRUCTOR, // 构造函数声明LOCAL_VARIABLE, // 局部变量声明ANNOTATION_TYPE, // 注解类型声明PACKAGE, // 包声明TYPE_PARAMETER, // 类型参数声明TYPE_USE // 类型使用
}
ElementType 的详细说明
值 | 描述 |
---|---|
TYPE | 用于类、接口、枚举的声明。 |
FIELD | 用于类的成员变量或枚举常量。 |
METHOD | 用于类或接口的方法。 |
PARAMETER | 用于方法的参数。 |
CONSTRUCTOR | 用于类的构造函数。 |
LOCAL_VARIABLE | 用于局部变量。 |
ANNOTATION_TYPE | 用于注解的定义。 |
PACKAGE | 用于指定包。 |
TYPE_PARAMETER | 用于泛型参数(JDK 1.8+)。 |
TYPE_USE | 用于任何类型的使用(JDK 1.8+),包括泛型、数组、类型转换等。 |
ElementType 示例
用于类
@Target(ElementType.TYPE)
@interface TypeAnnotation {}
用于方法
@Target(ElementType.METHOD)
@interface MethodAnnotation {}
用于局部变量
@Target(ElementType.LOCAL_VARIABLE)
@interface LocalVariableAnnotation {}
3. RetentionPolicy 与 ElementType 的结合应用
通过结合 RetentionPolicy
和 ElementType
,可以精准控制注解的生命周期和适用范围。开发者可以根据不同需求选择合适的生命周期策略和应用范围,从而提高注解的灵活性和可扩展性。
案例:开发一个运行时注解
需求:创建一个运行时注解,用于标记方法参数,并在运行时通过反射获取注解信息。
实现步骤
- 定义注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface ParamAnnotation {String value();
}
- 使用注解:
public class Example {public void sayHello(@ParamAnnotation("name") String name) {System.out.println("Hello, " + name);}
}
- 通过反射获取注解信息:
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;public class AnnotationDemo {public static void main(String[] args) throws Exception {Method method = Example.class.getMethod("sayHello", String.class);Parameter[] parameters = method.getParameters();for (Parameter parameter : parameters) {if (parameter.isAnnotationPresent(ParamAnnotation.class)) {ParamAnnotation annotation = parameter.getAnnotation(ParamAnnotation.class);System.out.println("Parameter: " + parameter.getName() + ", Value: " + annotation.value());}}}
}
运行结果
Parameter: arg0, Value: name
4. 总结与扩展
总结
RetentionPolicy
决定了注解的生命周期,常用策略为RUNTIME
,适用于动态处理。ElementType
决定了注解的适用范围,能够精确定位注解目标。- 两者结合为注解的使用提供了更多灵活性,能够满足复杂的业务需求。
扩展
- 组合注解:结合多个注解实现复杂功能,例如 Spring 的组合注解(@RestController)。
- 元注解:通过
@Retention
和@Target
定义新的注解行为。 - 工具化应用:使用注解生成代码(如 Lombok),或结合 AOP 实现切面逻辑。
通过对 RetentionPolicy
和 ElementType
的深入理解与灵活应用,开发者可以更高效地开发框架、工具和业务逻辑,充分发挥注解机制的优势。
相关文章:
Java 注解详解:RetentionPolicy 与 ElementType
文章目录 1. RetentionPolicy:注解的生命周期RetentionPolicy 的详细说明SOURCE 示例CLASS 示例RUNTIME 示例 2. ElementType:注解的应用范围ElementType 的详细说明ElementType 示例用于类用于方法用于局部变量 3. RetentionPolicy 与 ElementType 的结…...
javafx 将项目打包为 Windows 的可执行文件exe
要将 JavaFX 项目打包为 .exe 文件,你可以使用一些工具将你的应用程序封装为 Windows 可执行文件。以下是两种常用的方法: 方法 1:使用 jpackage(适用于 JDK 14 及更高版本) jpackage 是 JDK 内置的工具,…...
使用Chrome谷歌浏览器中内置翻译功能
谷歌Chrome浏览器作为全球最受欢迎的网络浏览器之一,提供了强大且便捷的内置翻译功能。这一功能帮助用户轻松跨越语言障碍,浏览试听包括音乐视频直播等网页内容了。 一、启用Chrome内置翻译功能 1、打开谷歌Chrome浏览器:确保你已经安装了最…...
Clojure语言的数据库编程
Clojure语言的数据库编程 引言 在当今社会,数据的处理和管理已经成为一个不可或缺的部分。无论是互联网应用、企业系统还是移动应用,都需要与数据库进行频繁的交互。因此,选择一种合适的编程语言和相应的库来进行数据库编程显得尤为重要。C…...
从零开始:使用VSCode搭建Python数据科学开发环境
引言 在数据科学领域,一个高效、稳定的开发环境是成功的关键。本文将详细介绍如何使用Visual Studio Code搭建一个完整的Python数据科学开发环境。通过本指南,您将学会: 安装和配置VSCode,包括基本设置和快捷键配置设置Python开…...
docker minio镜像arm64架构
minio版本为RELEASE.2021-09-03T03-56-13Z 原项目信创改造,服务器资源改为了arm64架构,统信uos docker镜像库内没有对应的minio镜像,当前镜像为拉取源码后,自编译打包镜像,亲测可用。 使用方式 将tar包导入到服务器…...
arcgisPro加载CGCS2000天地图后,如何转成米单位
1、导入加载的天地图影像服务,一开始是经纬度显示的。 2、右键地图,选择需要调整的投影坐标,这里选择坐标如下: 3、点击确定后,就可以调整成米单位的了。 4、切换后结果如下: 如有需要,可调整成…...
MySQL Binlog 监听方案
如果 EmbeddedEngine 类在 debezium-connector-mysql 中不可用,原因是 Debezium 的新版本移除了 EmbeddedEngine。这是因为 Debezium 的架构变更,它现在鼓励使用 Kafka Connect 或 Debezium Server 来处理数据变更事件。 下面是几种替代方法来实现 MySQ…...
openai swarm agent框架源码详解及应用案例实战
文章目录 简介数据类型Agent类Response类Result类Swarm类run_demo_loop交互式会话 基础应用agent-handsofffunction-callingcontext_variablestriage_agent 高阶应用通用客服机器人(support bot)构建航班服务agent 参考资料 openai 在24年10月份开源了一个教育性质的多agents协…...
Qt 5.14.2 学习记录 —— 팔 QWidget 常用控件(3)
文章目录 1、cursor2、font3、toolTip4、focusPolicy5、styleSheet 1、cursor 改变鼠标光标形状。 在Qt Designer界面中,拖一个按钮过来,右边属性面用户可以自己改cursor属性。 代码方法,先拖一个按钮到界面上: #include <Q…...
Nginx (40分钟学会,快速入门)
目录 一、什么是Nginx ? 可以做什么 ? 二、正向代理和反向代理 三、负载均衡 四、动静分离 五、Nginx 常用命令 六、Nginx实战及总结 一、什么是Nginx ? 可以做什么 ? Nginx 是高性能的 HTTP 和反向代理的 web 服务器,…...
C# 中await和async的用法(一)
在 C# 中,await 关键字用于异步编程,配合 async 方法一起使用。await 允许你等待异步操作完成,而不会阻塞当前线程。简而言之,await 会暂停当前方法的执行,直到任务完成,然后继续执行。 1. await与async的关…...
前端JS中var、let、const之间的区别
🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 一、var 二、let 三、const 四、区别 变量…...
【pyqt】(八)ui文件使用
ui文件使用 前面我们已经学过了简单的UI文件创建(利用Qt Designer)和基础控件的使用。现在我们学习如何把二者融合起来完成开发。UI文件以 XML 格式存储界面的布局和各种控件的属性,我们可以利用Qt Designer开发界面,然后利用代码…...
H2数据库在单元测试中的应用
H2数据库特征 用比较简洁的话来介绍h2数据库,就是一款轻量级的内存数据库,支持标准的SQL语法和JDBC API,工业领域中,一般会使用h2来进行单元测试。 这里贴一下h2数据库的主要特征 Very fast database engineOpen sourceWritten…...
ios越狱脚本巨魔商店安装教程
使用爱思助手安装 安装爱思助手:在电脑上安装 iTunes 和爱思助手,并使用 Apple ID 登录2。 IPA 签名:打开爱思助手,选择工具箱中的 IPA 签名。点击添加 IPA 文件,选择下载的 TrollInstallerX.ipa 文件。选择使用 Apple…...
Linux C编程——文件IO基础
文件IO基础 一、简单的文件 IO 示例二、文件描述符三、open 打开文件1. 函数原型2. 文件权限3. 宏定义文件权限4. 函数使用实例 四、write 写文件五、read 读文件六、close 关闭文件七、Iseek 绍 Linux 应用编程中最基础的知识,即文件 I/O(Input、Outout…...
【Rust自学】10.4. trait Pt.2:trait作为参数和返回类型、trait bound
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 说句题外话,写这篇的时间比写所有权还还花的久,trait是真的比较难理解的概念。 10.4.1. 把trait作为参数 继续以…...
Java 中的 getDeclaredMethod() 方法:使用与原理详解
在 Java 反射机制中,getDeclaredMethod() 是一个非常重要的方法,用于获取类中声明的特定方法(包括公共、保护、默认和私有方法)。与 getMethod() 不同,getDeclaredMethod() 可以访问类的所有方法,而不仅仅是…...
解决npm报错:sill idealTree buildDeps
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 报错信息 使用 npm 安装依赖时报错:sill idealTree buildDeps 解决方案 请按照以下步骤进行相关操作: 1、删除 C:\Users{账户}\ 文件夹中的 .npm…...
【游戏设计原理】55 - 风险评估
从本文讲述的内容来看,其实使用“游戏中的决策”作为标题更合适。 核心观点:玩家在游戏中不断进行决策,这些决策涵盖风险评估、资源分配、策略选择等多个方面,其核心是通过选择实现最大化回报或最小化损失。关键内容:…...
【AI日记】25.01.08
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI 参加:kaggle 比赛 Forecasting Sticker Sales 读书 书名:国家为什么会失败阅读原因:2024 年诺贝尔经济学奖得主的力作未删减版:https://boo…...
SAP BC 同服务器不同client之间的传输SCC1
源配置client不需要释放 登录目标client SCC1...
用Cline打造你的智能搜索助手:Tavily Search MCP集成指南
引言 本文将详细介绍如何在Cline编辑器中集成Tavily Search智能搜索功能。我们将从MCP(Model Context Protocol)协议基础开始,深入探讨Tavily Search MCP服务器的安装配置、使用方法,以及进阶的二次开发技巧。无论你是AI开发者还…...
未来商贸物流:人工智能与大数据的深度融合
未来商贸物流:人工智能与大数据的深度融合 在当今数字化浪潮汹涌澎湃的时代,商贸物流行业正站在变革的十字路口,而人工智能与大数据宛如一对闪耀的双子星,为其照亮前行的道路,深度融合之下,一个全新的未来…...
网络安全、Web安全、渗透测试之笔经面经总结(三)
本篇文章涉及的知识点有如下几方面: 1.什么是WebShell? 2.什么是网络钓鱼? 3.你获取网络安全知识途径有哪些? 4.什么是CC攻击? 5.Web服务器被入侵后,怎样进行排查? 6.dll文件是什么意思,有什么…...
BMS应用软件开发 — 3 电池系统的组成
目录 1 电池的基本拓扑 2 已经被淘汰的CTM 3 早已经普及的CTP 4 集成度更高的CTC 5 刚性更好的CTB 1 电池的基本拓扑 相比于燃油车,虽然电动车在结构空间上灵活度更高,空间利用率也更好,但现有条件下无法像燃油车一样快速补能ÿ…...
springboot 项目使用nacos注册中心配置,在windows系统下打jar包后不能启动的一个不好排查的问题
起因,一个项目使用的nacos注册中心配置,想学习运维一些知识,项目在本地idea,无论是run,debug模式,都可以正常运行。就学习如何打包,打包好后,如何运jar包,都启动不起来&a…...
Git撤销指定commit并更新远端仓库
Git撤销指定commit并更新远端仓库 一、撤销指定commit 1.首先执行git log 命令,查看git历史提交以及commit信息: 由于需要脱敏,所以截图可能看得马赛克比较多,需要关注的就是上面的commit后跟的id,以及HEAD当前指定…...
校园约拍微信小程序设计与实现ssm+论文源码调试讲解
4 系统设计 校园约拍微信小程序的设计方案比如功能框架的设计,比如数据库的设计的好坏也就决定了该系统在开发层面是否高效,以及在系统维护层面是否容易维护和升级,因为在系统实现阶段是需要考虑用户的所有需求,要是在设计阶段没…...
开源靶场1
我来为您介绍一些知名的开源漏洞靶场平台: DVWA (Damn Vulnerable Web Application) 最流行的 Web 漏洞靶场之一包含 SQL 注入、XSS、文件包含等常见漏洞基于 PHP MySQL适合 Web 安全入门学习 WebGoat OWASP 开源项目基于 Java包含大量 Web 安全漏洞练习提供详细的教程和解…...
iOS开发指南:保护服务器密码的安全存储与处理技巧
在iOS开发过程中,服务器密码的安全存储与处理是确保应用安全性的关键环节。不当的密码管理可能导致数据泄露、用户隐私受损,甚至引发更严重的安全问题。因此,开发者需要采取一系列措施来保护服务器密码的安全。本文将详细介绍在iOS开发中如何…...
《Spring Framework实战》9:4.1.4.依赖注入
欢迎观看《Spring Framework实战》视频教程 典型的企业应用程序不是由单个对象(或Spring术语中的bean)组成。即使是最简单的应用程序也有几个对象协同工作,以呈现最终用户所认为的连贯应用程序。下一节将解释如何从定义多个独立的bean定义到一…...
linux之自动挂载
如果想要实现自动挂载,应该挂在客户端!!!!! 客户端: [rootlocalhost ~]# yum install nfs-utils -y (下载软件) [rootlocalhost ~]# systemctl start nfs-utils.servic…...
python+fpdf:创建pdf并实现表格数据写入
目录 创建pdf文件对象 新增页 添加自定义字体 设置字体 设置文字颜色和背景色 插入内容 换行 插入图片 保存pdf 完整代码 安装:pip install fpdf 创建pdf文件对象 from fpdf import FPDF, Alignpdf = FPDF() # 创建pdf文件对象 获取边距 print(pdf.l_margin, p…...
比较procfs 、 sysctl和Netlink
procfs 文件系统和 sysctl 的使用: procfs 文件系统(/proc) procfs 文件系统是 Linux 内核向用户空间暴露内核数据结构以及配置信息的一种方式。`procfs` 的挂载点是 /proc 目录,这个目录中的文件和目录呈现内核的运行状况和配置信息。通过读写这些文件,可以查看和控制内…...
第四、五章补充:线代本质合集(B站:小崔说数)
视频1:线性空间 原视频:【线性代数的本质】向量空间、基向量的几何解释_哔哩哔哩_bilibili 很多同学在学习线性代数的时候,会遇到一个困扰,就是不知道什么是线性空间。因为中文的教材往往对线性空间的定义是非常偏数学的&#x…...
Clojure语言的函数实现
Clojure语言函数实现详解 引言 Clojure是一种基于Java虚拟机的函数式编程语言,以其简洁和强大的数据处理能力而著称。在Clojure中,函数是基本的构造块,良好的函数设计可以提高代码的可复用性和可维护性。本文将深入探讨Clojure中的函数实现…...
Windows10环境下安装RabbitMq折腾记
最近有个老项目需要迁移到windows10环境,用的是比较老的rabbitmq安装包,如下所示。经过一番折腾,死活服务起不来,最终果断放弃老版本启用新版本。现在把折腾过程记录下: 一、安装erlang 安装完成后的目录结构ÿ…...
【前端,TypeScript】TypeScript速成(九):async-await 语法糖
async-await 语法糖 可以使用 async-await 来管理 Promise,下例重写上一节使用 Promise then 的形式计算 ( 2 3 ) ( 4 5 ) (23) \times (45) (23)(45): function add(a: number, b: number): Promise<number>{return new Promise((resolve,…...
基于ADAS 与关键点特征金字塔网络融合的3D LiDAR目标检测原理与算法实现
一、概述 3D LiDAR目标检测是一种在三维空间中识别和定位感兴趣目标的技术。在自动驾驶系统和先进的空间分析中,目标检测方法的不断演进至关重要。3D LiDAR目标检测作为一种变革性的技术,在环境感知方面提供了前所未有的准确性和深度信息. 在这里&…...
STM32供电参考设计
STM32供电参考设计 在图中有VDD,VSS和VDDA,VSSA两种类型的供电引脚,其数据手册解释如下: 令我不解的是:VDDA和VSSA必须分别连接到VDD和VSS,这是什么意思?有大佬能够解答一下吗?…...
C/C++头文件uitility
在C中,<utility>头文件提供了一些通用的工具类和函数,这些工具类和函数在编写高效、可读性强的代码时非常有用。以下是<utility>头文件中一些常用函数和类的详细介绍及使用示例: std::pair:一个模板类,用于…...
Nature Electronics——近传感器计算:50 nm异构集成技术的革命
创新点:1.高密度互联设计:基于二维材料,开发出互连密度高达62,500 I/O每平方毫米的M3D集成结构。2.异构层堆叠:整合了第二层石墨烯化学传感器和第一层MoS₂记忆晶体管,实现功能互补。3.超短传感器与计算元件距离&#…...
腾讯云AI代码助手编程挑战赛-图片转换工具
作品简介: 解决了人们学习生活中的图片格式转换问题, 制作该脚本,省去了打开在线编辑器操作的时间, 免费为用户提供图片格式的转换的实用小工具 技术架构 python语言的tk库来完成的GUI页面设计, 引用PIL包转换图…...
英伟达Project Digits赋能医疗大模型:创新应用与未来展望
英伟达Project Digits赋能医疗大模型:创新应用与未来展望 一、引言 1.1 研究背景与意义 在当今数字化时代,医疗行业作为关乎国计民生的关键领域,正面临着前所未有的挑战与机遇。一方面,传统医疗模式在应对海量医疗数据的处理、复…...
查找路由器的管理后台ip【通用找IP】
需求: 刚刚搞了个【小米】路由器,我想进路由的管理后台,提示:安装xx的路由管家,我不想安装 但是无法找到这个管理后台。 而且我是用这个路由作为中继,那么这个路由的ip就会经常更换 尝试通过网上搜索引擎来…...
Nginx:Stream模块
什么是 Stream 模块? Stream 模块 是 Nginx 的一个核心模块,专为处理非 HTTP 协议的流量(TCP 和 UDP 流量)而设计。它可以用来负载均衡和代理 TCP 或 UDP 连接,适用于多种应用场景,如: 数据库集群(MySQL、PostgreSQL 等)邮件服务器(SMTP、IMAP、POP3)游戏服务器VoI…...
C++语言的并发编程
C语言的并发编程 引言 随着计算机技术的飞速发展,尤其是多核处理器的普及,如何高效地利用计算机资源成为了一个重要话题。在这个背景下,并发编程已经成为了一种必须掌握的技能。C作为一种强大的编程语言,也提供了丰富的工具和库…...
Boost.Asio 同步读写及客户端 - 服务器实现详解
Boost.Asio 同步读写及客户端 - 服务器实现详解 参考文献 Boost.Asio 官方文档学习资料来源: 参考网址 一、引言 Boost.Asio作为一个强大的跨平台网络编程库,为开发者提供了丰富的网络操作接口。在之前的学习中,我们已接触到其同步读写的API函数&…...