当前位置: 首页 > news >正文

【Java 基础篇】Java 注解详解

在这里插入图片描述

在 Java 编程中,注解(Annotation)是一种元数据,它提供了关于程序代码的额外信息。注解不直接影响程序的执行,但可以在运行时提供有关程序的信息,或者让编译器执行额外的检查。

本文将详细介绍 Java 注解的基本概念、内置注解和自定义注解的创建与使用。

1. 什么是注解?

注解是一种标记在 Java 类、方法、字段和其他程序元素上的特殊标签。这些标签提供了有关元素的额外信息,通常以注解的方式存储在 Java 源代码中。注解通常不影响程序的运行,但可以在编译时、运行时或通过工具进行处理。

Java 注解以 @ 符号开头,后跟注解的名称,如 @Override@Deprecated 等。注解可以有元素,元素以键值对的形式存储信息。以下是一个简单的注解示例:

@Author(name = "John Doe", date = "2023-09-01")
public class MyClass {// 类的内容
}

在上面的示例中,@Author 是一个自定义注解,具有两个元素 namedate,它们存储了有关类 MyClass 的信息。

2. 内置注解

Java 提供了一些内置注解,这些注解用于特殊的用途,如告诉编译器生成警告或错误,控制序列化过程等。以下是一些常见的内置注解:

2.1 @Override

@Override 注解用于告诉编译器,希望重写(覆盖)父类中的方法。如果父类中不存在与该方法签名匹配的方法,编译器会产生一个错误。

@Override
public void myMethod() {// 重写父类方法
}

2.2 @Deprecated

@Deprecated 注解用于标记方法、类或字段已过时,不推荐使用。编译器会发出警告,提示开发者尽量避免使用被标记为过时的元素。

@Deprecated
public class OldClass {// 类的内容
}

2.3 @SuppressWarnings

@SuppressWarnings 注解用于告诉编译器忽略特定类型的警告。这对于处理旧代码或集成第三方库时非常有用。

@SuppressWarnings("unchecked")
public List<String> getItems() {// 忽略类型未检查的警告return new ArrayList();
}

2.4 @SafeVarargs

@SafeVarargs 注解用于表示带有可变数量参数的方法是类型安全的。它告诉编译器,该方法不会导致堆污染警告。

@SafeVarargs
public final <T> List<T> asList(T... a) {// 方法内容
}

3. 自定义注解

除了使用内置注解,Java 还允许我们创建自定义注解。自定义注解可以用来添加程序的元数据,或者用于特定的用途,例如测试框架、依赖注入等。要创建自定义注解,需要使用 @interface 关键字。

3.1 创建自定义注解

以下是创建自定义注解的基本步骤:

// 定义自定义注解
public @interface MyAnnotation {String value() default "default value"; // 定义一个元素int number() default 0; // 定义另一个元素
}

上面的代码创建了一个名为 MyAnnotation 的自定义注解,它具有两个元素 valuenumber,并分别设置了默认值。

3.2 使用自定义注解

一旦定义了自定义注解,就可以将其用于类、方法、字段等程序元素上。

@MyAnnotation(value = "Custom Value", number = 42)
public class MyClass {// 类的内容
}

在上面的示例中,我们在 MyClass 类上应用了自定义注解 @MyAnnotation,并指定了元素 valuenumber 的值。

3.3 读取注解信息

要读取注解信息,可以使用 Java 的反射机制。以下是一个读取自定义注解信息的示例:

Class<?> clazz = MyClass.class;
MyAnnotation annotation = clazz.getAnnotation(MyAnnotation.class);if (annotation != null) {String value = annotation.value();int number = annotation.number();System.out.println("Value: " + value);System.out.println("Number: " + number);
} else {System.out.println("MyAnnotation not found.");
}

上面的代码首先获取了 MyClass 类的 MyAnnotation 注解,然后读取了注解的元素值,并打印出来。

4. 注解的元素

注解的元素可以是基本数据类型、字符串、枚举类型、注解类型或以上类型的数组。元素的默认值使用 default 关键字指定。

下面是一些注解元素的示例:

public @interface MyAnnotation {int value() default 0;String name() default "John";Color color() default Color.RED;String[] tags() default {};Class<?>[] classes() default {};MyOtherAnnotation otherAnnotation() default @MyOtherAnnotation;
}

5. 注解的使用场景

Java 注解在实际开发中有多种用途,包括:

  • 代码分析工具:可以使用注解来标记代码中的一些问题,如未使用的变量或方法,然后通过工具进行检查。

  • 依赖注入:许多依赖注入框架使用注解来标记需要注入的字段或方法。

  • 测试框架:测试框架如 JUnit 使用注解来标记测试方法。

  • 持久性框架:持久性框架如 Hibernate 使用注解来映射实体类与数据库表。

  • Web 开发:在 Spring 框架中,注解用于配置和管理 Bean。

6. 注解的注意事项

在使用注解时,需要注意以下几点:

  • 注解本身不影响程序的运行,只提供了元数据。

  • 注解在编译时可以被处理,也可以在运行时被处理,具体取决于注解的类型和用途。

  • 自定义注解需要使用 @Retention 指定它的保留策略,通常是 RUNTIME,以便在运行时读取注解信息。

  • 注解的元素名称通常为 value,但可以自定义其他名称。

  • 注解的元素类型受限于一些基本数据类型、枚举类型、字符串、注解类型和以上类型的数组。

7. 案例总结

假设我们正在开发一个简单的学生管理系统,我们想要为学生实体类添加一个自定义注解,用于标记优秀学生。首先,我们创建一个名为 Student 的学生类:

public class Student {private String name;private int age;private double gpa;// 构造方法和其他方法省略// 构造方法和其他方法省略public String getName() {return name;}public int getAge() {return age;}public double getGpa() {return gpa;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", gpa=" + gpa +'}';}
}

接下来,我们创建一个自定义注解 @ExcellentStudent,用于标记优秀学生:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.TYPE) // 该注解可以用在类上
@Retention(RetentionPolicy.RUNTIME) // 注解信息会保留到运行时
public @interface ExcellentStudent {
}

在上面的代码中,我们使用 @Target@Retention 注解来指定了自定义注解的使用范围和保留策略。

现在,让我们在 Student 类上应用 @ExcellentStudent 注解:

@ExcellentStudent
public class Student {private String name;private int age;private double gpa;// 构造方法和其他方法省略// 构造方法和其他方法省略public String getName() {return name;}public int getAge() {return age;}public double getGpa() {return gpa;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", gpa=" + gpa +'}';}
}

现在,我们已经在 Student 类上应用了 @ExcellentStudent 注解。接下来,我们可以使用反射来查找并识别优秀学生。以下是一个查找并打印优秀学生的示例:

import java.lang.annotation.Annotation;public class Main {public static void main(String[] args) {// 获取 Student 类的 Class 对象Class<?> clazz = Student.class;// 检查类上是否有 ExcellentStudent 注解if (clazz.isAnnotationPresent(ExcellentStudent.class)) {// 如果有,打印学生信息System.out.println("优秀学生信息:");Student student = new Student("Alice", 20, 4.0);System.out.println(student);} else {System.out.println("没有优秀学生信息。");}}
}

在上面的示例中,我们使用 clazz.isAnnotationPresent(ExcellentStudent.class) 检查 Student 类上是否有 @ExcellentStudent 注解。如果有,我们就打印该学生的信息。

这个案例演示了如何创建自定义注解,将其应用于类,并使用反射来识别带有注解的类。注解在实际开发中可以用于各种场景,以提供程序元数据和实现不同的逻辑。

8. 总结

本文介绍了 Java 注解的基本概念、内置注解和自定义注解的创建与使用。注解是一种有助于提供程序元数据的强大工具,它在各种 Java 应用程序中广泛使用,包括测试框架、依赖注入、持久性框架等。了解和熟练使用注解将有助于提高代码的可读性和可维护性,同时提供更多的元数据信息用于程序的分析和处理。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

相关文章:

【Java 基础篇】Java 注解详解

在 Java 编程中&#xff0c;注解&#xff08;Annotation&#xff09;是一种元数据&#xff0c;它提供了关于程序代码的额外信息。注解不直接影响程序的执行&#xff0c;但可以在运行时提供有关程序的信息&#xff0c;或者让编译器执行额外的检查。 本文将详细介绍 Java 注解的…...

MVVM框架下两窗口的消息传递

副窗口关闭的时候将bool类型传递出去 var message new CloseWindowMessage {MedicineView_DialogResult true }; //CloseWindowMessage是存储bool类型的标记类 Messenger.Default.Send(message); 主窗体中添加关闭处理的方法 private void HandleCloseWindowMessage(Clo…...

ROS2 从头开始​​:第6部分 - ROS2 中的 DDS,用于可靠的机器人通信

一、说明 在这篇文章中,我们将重点关注 ROS 2的通信栈DDS,其中这是介于管理节点通信与控制节点通信环节,是上位机决策体系与下位机的控制体系实现指令-执行-反馈的关键实现机制。 二、ROS工程的概念框架 现代机器人系统非常复杂,因为需要集成各种类型的传感器、执行器和其…...

WebSocket的那些事(6- RabbitMQ STOMP目的地详解)

目录 一、目的地类型二、Exchange类型目的地三、Queue类型目的地四、AMQ Queue类型目的地五、Topic类型目的地 一、目的地类型 在上节 WebSocket的那些事&#xff08;5-Spring STOMP支持之连接外部消息代理&#xff09;中我们已经简单介绍了各种目的地类型&#xff0c;如下图&…...

SQL SELECT 语句基础

在数字化的世界中,数据已经成为了一种无处不在的资源。从游戏开发到商业智能,数据分析都是不可或缺的一部分。SQL(结构化查询语言)是一种用于与数据库进行交互的编程语言,而SELECT 语句则是其中最基础也最常用的查询方式。 本文将通过对《三国志》游戏的角色数据进行分析…...

golang工程——protobuf使用及原理

相关文档 源码&#xff1a;https://github.com/grpc/grpc-go 官方文档&#xff1a;https://www.grpc.io/docs/what-is-grpc/introduction/ protobuf编译器源码&#xff1a;https://github.com/protocolbuffers/protobuf proto3文档&#xff1a;https://protobuf.dev/programmin…...

CocosCreator3.8研究笔记(二十三)CocosCreator 动画系统-动画编辑器相关功能面板说明

国庆假期&#xff0c;闲着没事&#xff0c;在家研究技术~ 上一篇&#xff0c;我们介绍了动画剪辑、动画组件以及基本的使用流程&#xff0c;感兴趣的朋友可以前往阅读&#xff1a; CocosCreator 动画系统-动画剪辑和动画组件介绍。 今天&#xff0c;主要介绍动画编辑器相关功能…...

免费 AI 代码生成器 Amazon CodeWhisperer 初体验

文章作者&#xff1a;浪里行舟 简介 随着 ChatGPT 的到来&#xff0c;不由让很多程序员感到恐慌。虽然我们阻止不了 AI 时代到来&#xff0c;但是我们可以跟随 AI 的脚步&#xff0c;近期我发现了一个神仙 AI 代码生产工具 CodeWhisperer &#xff0c;它是一项基于机器学习的服…...

谷歌扩展下载

Chrome 扩展下载安装网站推荐 # 1. 极简插件优质crx应用 ●地址&#xff1a;https://chrome.zzzmh.cn ●推荐&#xff1a;★★★★★ 一个非常良心 & 干净 & 简洁的 Chrome 扩展下载网站&#xff0c;体验非常不错&#xff01; 侧边栏可以通过类型对扩展进行筛选和排序&…...

Mac上如何修复损坏的音频?试试iZotope RX 10,对音频进行处理,提高音频质量!

iZotope RX 10是一款由iZotope公司开发的音频修复和编辑软件。它被广泛用于电影、电视、音乐和游戏等行业的音频后期制作&#xff0c;以及声音设计和修复工作。 在RX 10中&#xff0c;iZotope从头开始重新设计了全新的Repair Assistant修复助手&#xff0c;并且推出了相应的修…...

Mysql各种锁

一.不同存储引擎支持的锁机制 Mysql数据库有多种数据存储引擎&#xff0c;Mysql中不同的存储引擎支持不同的锁机制 MyISAM和MEMORY存储引擎采用的表级锁 InnoDB存储引擎支持行级锁&#xff0c;也支持表级锁&#xff0c;默认情况下采用行级锁 二.锁类型的划分 按照数据操作…...

【算法导论】快速排序

文章目录 1. 快速排序的描述 1.1基本描述1.2 PARTITOION函数1.3 快速排序C完整代码 2. 快速排序的性能2.1 最坏时间复杂度2.2 平均时间复杂度 1. 快速排序的描述 1.1基本描述 快速排序是一种时间复杂度为 O(n^2) 的排序算法。虽然最坏情况时间复杂度很差&#xff0c;但他的平…...

QT之QScriptEngine的用法介绍

QT之QScriptEngine的用法介绍 成员函数用法举例 成员函数 1&#xff09;QScriptEngine::evaluate(const QString &program, const QString &fileName QString(), int lineNumber 1) 执行 JavaScript 代码并返回结果。 2&#xff09;QScriptEngine::evaluate(const…...

vim 工具的使用

注&#xff1a;以下操作都在普通模式下进行 光标的移动操作 gg 定位到代码的第一行 shiftg 定位到代码的最后一行 nshiftg 定位到第n行 shift6: 特定一行的开始 shift4 特定一行的结尾 上下左右的移动光标 h: 向左移动光标 j: 向下移动光标 k: 向上移动光标 l: 向右移动光标 …...

RPA有什么优势?RPA的8大优势!建议学习!

随着科技的不断发展&#xff0c;越来越多的企业开始寻求数字化转型&#xff0c;以提高生产力和效率。在这个过程中&#xff0c;RPA&#xff08;Robotic Process Automation&#xff09;机器人流程自动化技术逐渐成为企业数字化转型的重要工具之一。本文将从八个方面阐述RPA的优…...

初级篇—第二章SELECT查询语句

文章目录 什么是SQLSQL 分类SQL语言的规则与规范阿里巴巴MySQL命名规范数据导入指令 显示表结构 DESC基本的SELECT语句SELECTSELECT ... FROM列的别名 AS去除重复行 DISTINCT空值参与运算着重号查询常数过滤数据 WHERE练习 运算符算术运算符加减符号乘除符号取模符号 符号比较运…...

PostMan的学习

PostMan的学习 目录 环境变量和全局变量接口关联内置动态参数以及自定义动态参数实现业务闭环Postman断言批量运行collection数据驱动之CSV文件和JSON文件测试必须带请求头的接口Mock Serviers 服务器Cookie鉴权NewmanPostManNewManjenkins实现接口测试持续集成 参考资料&am…...

配置OSPF路由

OSPF路由 1.OSPF路由 1.1 OSPF简介 OSPF(Open Shortest Path First&#xff0c;开放式最短路径优先&#xff09;路由协议是另一个比较常用的路由协议之一&#xff0c;它通过路由器之间通告网络接口的状态&#xff0c;使用最短路径算法建立路由表。在生成路由表时&#xff0c;…...

CCF CSP认证 历年题目自练Day17

CCF CSP认证 历年题目自练Day17 题目一 试题编号&#xff1a; 201803-1 试题名称&#xff1a; 跳一跳 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述   近来&#xff0c;跳一跳这款小游戏风靡全国&#xff0c;受到不少玩家的喜爱…...

基于Matlab实现多因子选股模型(附上源码+数据)

本文将介绍如何使用MATLAB实现多因子选股模型。我们将使用市盈率和市净率两个因子来进行选股&#xff0c;并通过简单的代码案例来演示该过程。 文章目录 引言简单案例总结源码数据下载 引言 多因子选股模型是一种常用的股票选股方法&#xff0c;通过综合考虑多个因子的信息来…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...