注解(Annotation)原理与自定义注解实战:你不懂的注解背后究竟发生了什么?
全文目录开篇语前言一、注解是什么注解的基本用法1. 基本语法二、注解的原理编译期、类加载期、运行时的作用1. 编译期注解不参与程序运行2. 类加载期注解可以用作元数据3. 运行时注解的核心应用三、注解的分类四、自定义注解实战我们来造一个“黑魔法”注解1. 定义一个自定义注解2. 使用自定义注解3. 创建注解处理器处理注解逻辑4. 测试5. 结果五、注解的高级应用Spring 和 Hibernate六、总结核心总结文末开篇语哈喽各位小伙伴们你们好呀我是喵手。运营社区C站/掘金/腾讯云/阿里云/华为云/51CTO欢迎大家常来逛逛今天我要给大家分享一些自己日常学习到的一些知识点并以文字的形式跟大家一起交流互相学习一个人虽可以走的更快但一群人可以走的更远。我是一名后端开发爱好者工作日常接触到最多的就是Java语言啦所以我都尽量抽业余时间把自己所学到所会的通过文章的形式进行输出希望以这种方式帮助到更多的初学者或者想入门的小伙伴们同时也能对自己的技术进行沉淀加以复盘查缺补漏。小伙伴们在批阅的过程中如果觉得文章不错欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持前言在 Java 编程中注解Annotation这一概念虽然很常见但很多开发者在使用时可能只是停留在“用来做标记、配置”这一层面。你是不是也觉得注解就是加在类、方法、字段前面的一些小符号能够影响程序的行为但并没深究过它背后的原理和使用技巧其实注解在 Java 中扮演着非常重要的角色它不仅仅是“装饰器”更是编译期、类加载期甚至运行时的一种强大工具。今天我们不仅要了解注解的基本原理还将通过自定义注解的实战带你进入注解的“魔法世界”让你不再仅仅满足于“好用”而是深入理解注解背后的设计思想和应用场景。所以坐稳了接下来我们一起深入探索注解的奥秘搞定自定义注解这门“黑魔法”一、注解是什么注解从字面上来看它就是对代码的元数据注解。也就是说它不会直接影响程序的逻辑行为但能通过某些工具或框架读取并执行对应的功能。Java 中的注解并不是程序执行的一部分而是用来描述程序的结构、元信息甚至在特定的情况下改变程序的行为。注解的基本用法注解的定义非常简单语法结构类似于接口。常见的注解如Override、Deprecated、Entity等。它们一般不会影响程序的执行而是给编译器或者运行时提供一些额外的信息。// 使用 Override 注解表示该方法重写了父类的方法OverridepublicStringtoString(){returnHello, World!;}// 使用 Deprecated 注解表示该方法已过时不推荐使用DeprecatedpublicvoidoldMethod(){System.out.println(This method is outdated!);}1. 基本语法interfaceMyAnnotation{// 定义一个注解Stringvalue()defaultDefault;}简单来说注解就是用开头的特殊标记它可以附加在类、方法、字段、参数等位置。二、注解的原理编译期、类加载期、运行时的作用1. 编译期注解不参与程序运行注解可以在编译时用于检查比如Override它会帮助编译器检查我们是否真正重写了父类方法。如果我们用Override注解修饰的方法在父类中不存在编译器会报错。OverridepublicvoidsomeMethod(){// 编译期检查父类是否有该方法System.out.println(Hello);}2. 类加载期注解可以用作元数据注解还可以在类加载期间用于一些框架或工具类的处理比如 Spring 框架就是通过注解如Autowired来实现依赖注入的。3. 运行时注解的核心应用注解的最强大之处是在运行时它能通过反射机制被程序读取并执行。比如使用Entity注解标记的类ORM 框架如 Hibernate会在程序启动时通过反射读取注解信息进而将该类映射成数据库表。EntitypublicclassUser{IdprivateLongid;privateStringname;}三、注解的分类Java 中的注解有多种分类方式按照作用域和生命周期常见的分类方式如下标准注解Built-in AnnotationsOverride标识重写父类的方法。Deprecated标记该方法或类已经不推荐使用。SuppressWarnings抑制编译器警告。元注解Meta-AnnotationsRetention定义注解的生命周期。Target指定注解可以应用于哪些元素类、方法、字段等。Inherited使得注解可以从父类继承到子类。Documented使注解能够包含在 Javadoc 中。自定义注解Custom Annotations我们可以根据需要自定义注解下面将通过一个实际的案例来演示如何定义和使用自定义注解。四、自定义注解实战我们来造一个“黑魔法”注解1. 定义一个自定义注解我们先定义一个注解用于标记方法是否需要进行日志记录。// 定义注解Retention(RetentionPolicy.RUNTIME)// 注解在运行时有效Target(ElementType.METHOD)// 注解只能应用于方法上publicinterfaceLogExecutionTime{// 你可以在注解中定义元素作为附加信息}这里的Retention(RetentionPolicy.RUNTIME)表示注解会在运行时通过反射获取Target(ElementType.METHOD)表示注解只能用在方法上。2. 使用自定义注解接下来我们用这个注解来标记需要记录执行时间的方法publicclassMyService{LogExecutionTime// 标记需要记录执行时间publicvoidprocessData(){// 模拟一些耗时操作try{Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}}}3. 创建注解处理器处理注解逻辑接下来我们创建一个注解处理器通过反射扫描LogExecutionTime注解并记录方法的执行时间importjava.lang.annotation.Annotation;importjava.lang.reflect.Method;publicclassLogExecutionTimeProcessor{publicstaticvoidprocess(Objectobject)throwsException{// 获取对象的所有方法Method[]methodsobject.getClass().getMethods();for(Methodmethod:methods){// 检查方法上是否有 LogExecutionTime 注解if(method.isAnnotationPresent(LogExecutionTime.class)){longstartTimeSystem.currentTimeMillis();// 执行方法method.invoke(object);longendTimeSystem.currentTimeMillis();System.out.println(Execution time of method.getName(): (endTime-startTime) ms);}}}}4. 测试在main方法中我们创建MyService对象并使用注解处理器来记录方法执行时间publicclassMain{publicstaticvoidmain(String[]args)throwsException{MyServicemyServicenewMyService();LogExecutionTimeProcessor.process(myService);}}5. 结果程序运行后输出类似以下内容Execution time of processData: 1001 ms这就实现了通过自定义注解来记录方法的执行时间。注解的真正威力在于它能够让我们的代码更加简洁并且通过注解处理器灵活地控制行为。五、注解的高级应用Spring 和 Hibernate在框架中注解的使用已经达到极致尤其是 Spring 和 Hibernate 这样的框架它们几乎所有的功能都依赖于注解进行配置。比如Spring 注解Autowired、Component、Service、RequestMapping等Spring 容器通过这些注解来进行自动化装配和控制反转IoC。Hibernate 注解Entity、Id、Column等Hibernate 使用这些注解来映射 Java 类与数据库表之间的关系。这些框架的工作原理实际上都是通过扫描这些注解并通过反射获取相关信息最终动态生成代码执行操作。六、总结通过今天的讲解我们已经从注解的基础用法到自定义注解的实战应用都有了全面的了解。你会发现注解不仅仅是一个简单的标记它的设计原理和应用场景都充满了“魔力”它能够大大简化开发中的许多复杂任务。核心总结注解的作用通过元数据来描述程序的结构或提供额外的信息不直接影响程序的逻辑。自定义注解的优势通过反射机制能够在运行时灵活地处理业务逻辑提高程序的可扩展性和解耦性。高级应用注解在 Spring、Hibernate 等框架中得到广泛应用真正体现了注解在代码中的“黑魔法”力量。… …文末好啦以上就是我这期的全部内容如果有任何疑问欢迎下方留言哦咱们下期见。… …学习不分先后知识不分多少事无巨细当以虚心求教三人行必有我师焉wished for you successed ⭐️若喜欢我就请关注我叭。⭐️若对您有用就请点赞叭。⭐️若有疑问就请评论留言告诉我叭。版权声明本文由作者原创转载请注明出处谢谢支持

相关新闻

PLC基本指令详解:从位逻辑到定时计数,掌握梯形图编程核心

PLC基本指令详解:从位逻辑到定时计数,掌握梯形图编程核心

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 3:19:56 阅读更多 →
柔性上料盘如何替代振动盘:从换型瓶颈到视觉引导的产线升级指南

柔性上料盘如何替代振动盘:从换型瓶颈到视觉引导的产线升级指南

简介:《全球与中国柔性上料盘市场现状及未来发展趋势(2024版)》是一份QYResearch出品的专业市场研究报告,面向柔性上料与自动化产线设备从业者、工业机器人厂商、市场分析师及投资研究人员。报告以2019至2023年为历史期、2024至20…

2026/10/12 3:19:56 阅读更多 →
WiFi分析工具设计实战:从数据采集到信道优化与故障排查

WiFi分析工具设计实战:从数据采集到信道优化与故障排查

1. 从一个标题说起:这个工具到底在解决什么问题第一次看到“Jev powered WiFi analysis tool”这个标题,我的直觉是:这大概率是一个把无线网络分析能力封装成轻量级工具的项目,名字里的“Jev”可能是作者自定的代号、模块名或者某…

2026/10/12 3:19:56 阅读更多 →

最新新闻

在Mac上搞定Spine 2D骨骼动画:从安装到运行时接入的完整工作流

在Mac上搞定Spine 2D骨骼动画:从安装到运行时接入的完整工作流

简介:Spine for Mac是面向2D游戏开发者的专业骨骼动画工具,帮助设计师通过绑定图像到骨骼结构快速制作动态角色,减少逐帧动画的重复劳动。该工具在macOS上保持良好兼容性,支持实时预览、IK反向动力学、动画状态机与纹理自动打包&a…

2026/10/12 4:06:27 阅读更多 →
IPP网络打印协议解析:从驱动less打印到ipptool调试与配置实战

IPP网络打印协议解析:从驱动less打印到ipptool调试与配置实战

简介:这是一份面向网络开发者的 IPP 网络打印协议源码包,完整呈现基于 HTTP/1.1 的打印作业提交、打印机状态查询、作业控制及属性扩展等标准实现,强调跨平台设备间的互操作性,适合需要开发打印客户端、研究协议解析或进行系统集成…

2026/10/12 4:06:27 阅读更多 →
论文降AI率后如何验证效果?AIGC检测交叉验证与流程解析

论文降AI率后如何验证效果?AIGC检测交叉验证与流程解析

上周三晚上,一个正在改毕业论文的学妹发来消息:“师兄,我用了各种方法,把AI检测率从45%降到了9%,可自己看着还是心虚,这结果到底算不算数?”这个问题其实问到了点子上。很多人闷头改了好几天&am…

2026/10/12 4:06:27 阅读更多 →
Dendrite 版本演进全解析:从 CHANGES.md 看 Matrix 第二代 homeserver 的技术脉络

Dendrite 版本演进全解析:从 CHANGES.md 看 Matrix 第二代 homeserver 的技术脉络

后端即时通讯 【免费下载链接】dendrite Dendrite is a second-generation Matrix homeserver written in Go! 项目地址: https://gitcode.com/gh_mirrors/de/dendrite 点击查看 免费下载 导读:本文以仓库根目录的 CHANGES.md 为主线,系统梳…

2026/10/12 4:06:27 阅读更多 →
记一次k8s flannel/calico/coredns一切正常,但是互访失败

记一次k8s flannel/calico/coredns一切正常,但是互访失败

k8s flannel/calico安装后,和coredns一切正常,但是互访失败确认节点服务器之间UDP是否正常,特别是电信的天翼云,封了UDP通信(其他厂商适用)验证方法# 一个节点监听,一个节点请求宿主之间原始IP …

2026/10/12 4:06:27 阅读更多 →
WinForm分页性能优化:SQL服务端分页+DataGridView虚拟模式实战

WinForm分页性能优化:SQL服务端分页+DataGridView虚拟模式实战

简介:这是一份面向Windows Forms初学者与中级开发者的实用分页控件实现方案,专为解决大数据量下DataGridView性能瓶颈与用户体验不佳问题而设计。资源完整封装了可直接集成的自定义分页控件(PagerControl.cs及配套设计器、资源文件&#xff0…

2026/10/12 4:05:27 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →