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注解的相关知识,希望对各位看官有所帮助,下期见,谢谢~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/884472.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Power Automate 设置流Owner不生效的bug

在查找某个功能没生效时,定位到是一个Power automate的流停了,查看原因是因为创建流的owner被disable了 但是当把流的owner更新为可用的用户时,流依旧没被触发,触发的条件很简单,某个表的记录创建时,因为是…

操作系统与进程

1.操作系统 操作系统是计算机中的一个重要软件,它是一个专门进行管理的软件。操作系统可以通过驱动程序来间接管理外部硬件,也可以为计算机中的程序提供一个稳定的运行环境,从而来方便管理各种程序的运行,让程序之间的运行互不影…

传知代码-基于图神经网络的知识追踪方法(论文复现)

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 1.论文概述 论文链接提出了一种基于图神经网络的知识追踪方法,称为基于图的知识追踪(GKT)。将知识结构构建为图,其中节点对应于概念,边对应于它们之间的…

【JavaEE】——单例模式引起的多线程安全问题:“饿汉/懒汉”模式,及解决思路和方法(面试高频)

阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!希望本文内容能够帮助到你! 目录 一:单例模式(singleton) 1:概念 二:“饿汉模…

Enhancing Trust in LLMs: Algorithms for Comparing and Interpreting LLMs

文章目录 题目摘要引言透明度的必要性对信任的追求困惑度测量自然语言处理(NLP)评估指标零投学习绩效少量学习性能迁移学习对抗测试公平和偏见稳健性评估LLMMaps基准测试和排行榜分层分析布鲁姆分类法的可视化幻觉评分知识分层策略利用机器学习模型进行层级生成注意力可视化LLM…

css五种定位总结

在 CSS 中,定位(Positioning)主要有五种模式,每种模式的行为和特点不同,以下是 static、relative、absolute、fixed 和 sticky 五种定位方式的对比总结: 1. static(默认定位) 特性…

阿里云函数计算 x NVIDIA 加速企业 AI 应用落地

作者:付宇轩 前言 阿里云函数计算(Function Compute, FC)是一种无服务器(Serverless)计算服务,允许用户在无需管理底层基础设施的情况下,直接运行代码。与传统的计算架构相比,函数…

【2023工业3D异常检测文献】PointCore: 基于局部-全局特征的高效无监督点云异常检测器

PointCore: Efficient Unsupervised Point Cloud Anomaly Detector Using Local-Global Features 1、Background 当前的点云异常检测器可以分为两类: (1)基于重建的方法,通过自动编码器重建输入点云数据,并通过比较原…

07-阿里云镜像仓库

07-阿里云镜像仓库 注册阿里云 先注册一个阿里云账号:https://www.aliyun.com/ 进入容器镜像服务控制台 工作台》容器》容器服务》容器镜像服务 实例列表》个人实例 仓库管理》镜像仓库》命名空间》创建命名空间 仓库管理》镜像仓库》镜像仓库》创建镜像仓库 使…

【AI】深度学习的数学--核心公式

1 梯度下降 f ( x Δ x , y Δ y ) ≃ f ( x , y ) ∂ f ( x , y ) ∂ x Δ x ∂ f ( x , y ) ∂ y Δ y f(x\Delta x,y\Delta y) \simeq f(x,y)\frac{\partial f(x,y)}{\partial x}\Delta x\frac{\partial f(x,y)}{\partial y}\Delta y f(xΔx,yΔy)≃f(x,y)∂x∂f(x,y)​…

MySQL 性能剖析全攻略

在使用 MySQL 数据库的过程中,性能问题往往是让开发者和管理员头疼的难题。为了有效地解决这些问题,我们需要对 MySQL 进行性能剖析。那么,如何在 MySQL 中进行性能剖析呢?本文将为你详细介绍。 一、为什么要进行性能剖析&#x…

基于安卓开发大型体育场管理系统的设计与实现(源码+定制+讲解)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

《开题报告》基于SpringBoot框架的高校专业实习管理系统开题报告的设计与实现源码++学习文档+答辩讲解视频

开题报告 研究背景 在当今高等教育日益普及与深化的背景下,高校专业实习作为学生将理论知识转化为实践能力、提前适应社会工作环境的重要环节,其重要性不言而喻。然而,传统的高校专业实习管理模式往往存在信息不对称、流程繁琐、效率低下、…

SSM+Vue共享单车管理系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作…

代码随想录_刷题记录_第四次

二叉树 — 理论基础 种类: 满二叉树(所有层的节点都是满的,k:深度 节点数量:2^k - 1)完全二叉树(除了最后一层,其余层全满,并且最后一层从左到右连续)二叉搜…

信道衰落的公式

对于天线: 对于天线的面积计算: 天线的接收功率密度: 天线的接收功率: 移动无线信道(I) (xidian.edu.cn)https://web.xidian.edu.cn/zma/files/20150710_153736.pdf 更加常用的考虑了额外的信道衰落pathlo…

2024 maya的散布工具sppaint3d使用指南

目前工具其实可以分为三个版本 1 最老的原版 时间还是2011年的,只支持python2版的maya 2 作者python3更新版 后来作者看maya直到2022上还是没有类似好用方便的工具,于是更新到了2022版本 这个是原作者更新的2022版本,改成了python3&#…

敏感字段加密 - 华为OD统一考试(E卷)

2024华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集 题目描述 【敏感字段加密】给定一个由多个命令字组成的命令字符串: 1、字符串长度小于等于127字节,只包含大小写字母,数字,下划线和偶数个双引号; 2、命令字之间以一个或多个下划线 进行分割; 3、可…

Study-Oracle-10-ORALCE19C-RAC集群搭建(一)

一、硬件信息及配套软件 1、硬件设置 RAC集群虚拟机:CPU:2C、内存:10G、操作系统:50G Openfile数据存储:200G (10G*2) 2、网络设置 主机名公有地址私有地址VIP共享存储(SAN)rac1192.168.49.13110.10.10.20192.168.49.141192.168.49.130rac2192.168.49.13210.10.10.3…

单体到微服务架构服务演化过程

架构服务化 聊聊从单体到微服务架构服务演化过程 单体分层架构 在 Web 应用程序发展的早期,大部分工程是将所有的服务端功能模块打包到单个巨石型(Monolith)应用中,譬如很多企业的 Java 应用程序打包为 war 包,最终会形…