Java 之注解详解
Java 注解(Annotation)自 Java 5 版本引入,为代码提供了强大的元数据支持。它们如同代码中的标记,能够被编译器、工具和运行时环境识别,赋予代码更丰富的语义和更强大的功能。
一、注解入门
1.1 初识注解:代码中的特殊标记
Java 注解以 @注解名 的形式出现,附着于类、接口、方法、字段、参数等程序元素之上,为它们添加额外的信息。
例如:
@Override
public String toString() {// ...
}
这里的 @Override 注解明确告诉编译器该方法旨在重写父类的方法。
1.2 注解的用途:三种主要应用方式
注解本身不会直接参与代码逻辑的运行,但它们能够引导代码的行为,其主要用途包括:
-
编译器指令:
注解可以指导编译器的行为,例如 @Override 指示检查方法重写,@SuppressWarnings 指示抑制特定警告信息。
-
代码分析:
各种工具可以利用注解进行代码分析,例如生成API文档、执行代码规范检查、进行代码统计等。
-
运行时处理:
一些框架利用注解实现运行时功能,例如Spring框架使用 @Component、@Autowired 等注解实现依赖注入,极大地简化了配置。
1.3 内置注解:Java 提供的常用工具
Java 提供了一些内置注解,可以方便地应用于各种场景:
-
@Override:
确保方法正确重写父类方法,避免因拼写错误导致的意外行为。
-
@Deprecated:
标记已过时的元素,建议开发者不再使用,并提供替代方案的说明。
-
@SuppressWarnings:
抑制编译器发出的特定警告信息,例如针对未使用变量的警告。
-
@FunctionalInterface:
标记函数式接口,确保接口只有一个抽象方法,方便使用Lambda表达式。
二、自定义注解
2.1 定义注解:编写自定义规则
Java允许我们自定义注解,为代码赋予特定含义。定义注解使用 @interface 关键字,结构类似于接口定义:
@interface MyAnnotation {String author() default "Anonymous"; // 定义一个名为author的注解元素int version() default 1; // 定义一个名为version的注解元素
}
-
@interface: 声明这是一个注解类型。
-
author, version: 注解的成员,称为注解元素,可以设置默认值。
2.2 元注解:设定注解规则和范围
元注解是用于注解其他注解的注解,为注解设定使用规则和范围。Java 提供了以下元注解:
-
@Retention:
指定注解的生命周期,控制注解何时生效:
-
RetentionPolicy.SOURCE: 注解只保留在源代码中,编译时会被丢弃。
-
RetentionPolicy.CLASS: 注解保留在字节码文件中,但运行时不可获取。
-
RetentionPolicy.RUNTIME: 注解保留在字节码文件中,并在运行时可通过反射获取。
-
-
@Target:
指定注解可以应用的程序元素类型,例如:
-
ElementType.TYPE: 类、接口、枚举
-
ElementType.METHOD: 方法
-
ElementType.FIELD: 字段
-
ElementType.PARAMETER: 参数
-
-
@Documented:
将注解包含在 Javadoc 生成的文档中,方便开发者查阅。
-
@Inherited:
允许子类继承父类的注解,简化代码。
2.3 使用自定义注解:为代码添加标记
定义好注解后,就可以为程序元素添加注解:
@MyAnnotation(author = "John Doe", version = 2)
public class MyClass {// ...
}
三、注解处理器
注解本身只是被动地存在于代码中,要发挥其作用,需要借助注解处理器来解读和应用注解信息。
3.1 反射机制:运行时获取注解信息
Java 反射机制可以在运行时获取注解信息:
MyClass myClass = new MyClass();
MyAnnotation annotation = myClass.getClass().getAnnotation(MyAnnotation.class);
String author = annotation.author(); // 获取注解元素的值
3.2 自定义注解处理器:编写注解解析器
我们可以自定义注解处理器,在编译期解析和处理注解,实现更强大的功能。
自定义注解处理器需要实现 javax.annotation.processing.Processor 接口,并注册到编译器中。
四、注解应用场景
注解在各种框架和工具中发挥着重要作用:
-
Spring框架:
使用 @Component、@Autowired 等注解实现依赖注入,使用 @Transactional 实现声明式事务管理,大大简化了开发。
-
Hibernate框架:
使用 @Entity、@Table、@Column 等注解将Java对象映射到数据库表,实现对象关系映射(ORM)。
-
单元测试框架(JUnit, TestNG):
使用 @Test、@Before、@After 等注解标记测试方法、设置测试环境,简化了测试代码的编写。
-
代码生成工具(Lombok):
使用 @Getter、@Setter、@ToString 等注解自动生成getter、setter、toString等方法,减少了样板代码。
五、总结
Java 注解为我们提供了一种强大的代码元数据机制,可以提高代码的可读性、可维护性和可扩展性。通过学习和掌握注解的使用,我们能够更好地理解和应用各种框架和工具,编写出更优雅、高效的代码。
以上就是关于Java注解的相关知识,希望对各位看官有所帮助,下期见,谢谢~
相关文章:
Java 之注解详解
Java 注解(Annotation)自 Java 5 版本引入,为代码提供了强大的元数据支持。它们如同代码中的标记,能够被编译器、工具和运行时环境识别,赋予代码更丰富的语义和更强大的功能。 一、注解入门 1.1 初识注解:…...
计算机视觉实战项目4(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人机检测+A*路径规划+单目测距与测速+行人车辆计数等)
往期热门项目回顾: 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 AI健身教练-引体向上-俯卧撑计数…...
【Spring Cloud】Spring Cloud 概述
Spring Cloud 概述 1. 认识微服务1.1 单体架构1.2 集群和分布式架构集群和分布式 1.3 微服务架构分布式架构&微服务架构 1.4 微服务带来的挑战优势挑战 2. 微服务解决⽅案- Spring Cloud2.1 什么是Spring Cloud2.2 Spring Cloud版本Spring Cloud和SpringBoot的关系 2.3 Spr…...
猫头虎带你解决:error Error: certificate has expired
🐯猫头虎带你解决:error Error: certificate has expired 💥 今天有粉丝问猫哥:“🐯猫头虎,我在 Node.js 项目中使用 Yarn 安装包时遇到了一个错误:Error: certificate has expired。你能帮忙解…...
盘点2024年4款高效率的语音转文字工具。
语音转换文字软件真的是一种提高效率的神器,我在工作中常常因为手动记录太慢而选择录音。事后在形成记录,但效率比较低。自从知道有直接转换的工具之后,我有再多的录音都不怕了。如果大家也有跟我一样的工作时,可以试试使用这些语…...
记录Mac编译Android源码踩过的坑
学习Android源码,如果电脑配置还不错,最好还是下载一套源码,经过编译后导入到Android Studio中来学习,这样会更加的直观,代码之间的跳转查看会更加方便。因此,笔者决定下载并编译一套源码,以利于…...
C++ 数据结构算法细节相关
细节 队列 这段代码实现的是二叉树的层序遍历,也就是按照树的层次,一层一层地遍历节点。下面我会为你详细解释这段代码。 queue <TreeNode*> q; 这是一个队列,队列中存放的是指向TreeNode的指针。队列(queue)是…...
【HTML5】html5开篇基础(1)
1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…...
C#自定义曲线绘图面板
一、实现功能 1、显示面板绘制。 2、拖动面板,X轴、Y轴都可以拖动。 3、显示面板缩放,放大或者缩小。 4、鼠标在面板中对应的XY轴数值。 5、自动生成的数据数组,曲线显示。 6、鼠标是否在曲线上检测。 二、界面 拖动面板 鼠标在曲线上…...
Java后端面试题+下一篇答案+实况场景题
uu们大家好!市面上面试题很多,这边汇总并更新一下java后端面试的题目,助大家早日斩下心仪的offer!!(下次跟新场景题...等我多碰几次壁...哈哈哈哈哈) 这边放题目,下一篇跟新所有另面…...
完美解决vant浮动气泡+弹出菜单
使用框架: vue3,vant4 项目需求: 需要有一个浮动气泡,点击弹出导航菜单 遇到的问题: 1. 使用van-floating-bubble包裹van-popover,但点击后只会重复显示不能隐藏 2. popover位置固定,不能根据…...
SpringSecurity -- 入门使用
文章目录 什么是 SpringSesurity ?细节使用方法 什么是 SpringSesurity ? 在我们的开发中,安全还是有些必要的 用 拦截器 和 过滤器 写代码还是比较麻烦。 SpringSecurity 是 SpringBoot 的底层安全默认选型。一般我们需要认证和授权…...
C语言习题~day33
1.以下程序运行时,若输入1abcedf2df输出结果是() #include <stdio.h> int main() { char a 0, ch; while ((ch getchar()) ! \n) { if (a % 2 ! 0 && (ch > a && ch < z)) ch ch - a A; a; putchar(ch); }…...
作业报告┭┮﹏┭┮(Android反调试)
一:Android反调试 主要是用来防止IDA进行附加的,主要的方法思路就是,判断自身是否有父进程,判断是否端口被监听,然后通过调用so文件中的线程进行监视,这个线程开启一般JNI_OnLoad中进行开启的。但是这个是…...
在 Delphi BSD11中安装 DCU 格式的第三方组件库
在 Delphi BSD 11 中安装 DCU 格式的第三方组件库可以按照以下步骤进行: 打开 Delphi:启动 Delphi 开发环境。 选择安装组件: 在菜单栏中,选择 Component -> Install Component。 选择 DCU 文件: 在弹出的对话框中…...
综合题第二题(路由器的配置)
题目 如何计算子网掩码 第一类 我们可以观察到上图的IP地址后面有“/26”、“30”。我们都知道子网掩码是由多个连续“1”和多个连续“0”组成的,“、26”表示子网掩码的二进制表达中有26个1。 例如:156.95.9.128/26 1111 1111.1111 1111.1111 1111.1…...
人工智能概览
目录 什么是人工智能 人工智能的历史与发展 人工智能发展时间轴示意图: 人工智能的主要分支 机器学习与深度学习在AI中的地位 什么是人工智能 人工智能(Artificial Intelligence, AI)是指由人制造出来的具有一定智能的系统,能够理…...
[vulnhub] Prime 1
https://www.vulnhub.com/entry/prime-1,358/ 主机发现端口扫描 探测存活主机,137是靶机 nmap -sP 192.168.75.0/24 // Starting Nmap 7.93 ( https://nmap.org ) at 2024-09-22 16:25 CST Nmap scan report for 192.168.75.1 Host is up (…...
JavaSE——lombok、juint单元测试、断言
一、lombok的使用 默认jvm不解析第三方注解,需要手动开启 链式调用 二、juint单元测试 下载juint包 public class TestDemo {// 在每一个单元测试方法执行之前执行Beforepublic void before() {// 例如可以在before部分创建IO流System.out.println("befor…...
商标价值如何评估与增值?
商标是企业的标志,代表着企业的产品或服务质量、信誉和形象。一个具有高知名度和美誉度的商标,能够为企业带来巨大的商业价值。它不仅可以帮助企业在市场中脱颖而出,吸引消费者的关注和购买,还可以作为企业的重要资产进行融资、并…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...
