当前位置: 首页 > 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;通过综合考虑多个因子的信息来…...

【中秋国庆不断更】OpenHarmony多态样式stateStyles使用场景

Styles和Extend仅仅应用于静态页面的样式复用&#xff0c;stateStyles可以依据组件的内部状态的不同&#xff0c;快速设置不同样式。这就是我们本章要介绍的内容stateStyles&#xff08;又称为&#xff1a;多态样式&#xff09;。 概述 stateStyles是属性方法&#xff0c;可以根…...

Qt扩展-QCustomPlot绘图基础概述

QCustomPlot绘图基础概述 一、概述二、改变外观1. Graph 类型2. Axis 坐标轴3. 网格 三、案例1. 简单布局两个图2. 绘图与多个轴和更先进的样式3. 绘制日期和时间数据 四、其他Graph&#xff1a;曲线&#xff0c;条形图&#xff0c;统计框图&#xff0c;… 一、概述 本教程使用…...

二、局域网联机

目录 1.下载资源包 2.配置NetworkManager 3.编写测试UI 1.下载资源包 2.配置NetworkManager &#xff08;1&#xff09;在Assets/Prefabs下创建Network Prefabs List 相应设置如下&#xff1a; &#xff08;2&#xff09; 创建空物体“NetworkManager”并挂载NetworkMan…...

决策树剪枝:解决模型过拟合【决策树、机器学习】

如何通过剪枝解决决策树的过拟合问题 决策树是一种强大的机器学习算法&#xff0c;用于解决分类和回归问题。决策树模型通过树状结构的决策规则来进行预测&#xff0c;但在构建决策树时&#xff0c;常常会出现过拟合的问题&#xff0c;即模型在训练数据上表现出色&#xff0c;…...

Ubuntu部署运行ORB-SLAM2

ORB-SLAM2是特征点法的视觉SLAM集大成者&#xff0c;不夸张地说是必学代码。博主已经多次部署运行与ORB-SLAM2相关的代码&#xff0c;所以对环境和依赖很熟悉&#xff0c;对整个系统也是学习了几个月&#xff0c;一行行代码理解。本次在工控机上部署记录下完整的流程。 ORB-SLA…...

二十,镜面IBL--打印BRDF积分贴图

比起以往&#xff0c;这节应该是最轻松的了&#xff0c; 运行结果如下 代码如下&#xff1a; #include <osg/TextureCubeMap> #include <osg/TexGen> #include <osg/TexEnvCombine> #include <osgUtil/ReflectionMapGenerator> #include <osgDB/Re…...

自动驾驶:未来的道路上的挑战与机遇

自动驾驶&#xff1a;未来的道路上的挑战与机遇 文章目录 引言安全与道路事故的减少交通拥堵的缓解城市规划的变革技术和法律挑战结语 2023星火培训【专项营】Apollo开发者社区布道师倾力打造&#xff0c;包含PnC、新感知等的全新专项课程上线了。理论与实践相结合&#xff0c;…...

Go 语言 iota 的神奇力量

前言 当你深入研究官网库、开源库或者任何一个 Go 项目时&#xff0c;你都会发现 iota 这个神奇的标识符无处不在。它扮演着一种重要的角色&#xff0c;让代码变得更加简洁、清晰&#xff0c;并提高了可读性和可维护性。它的应用范围广泛&#xff0c;从枚举类型到位运算&#…...

前端开发和后端开发的一些建议

前端开发和后端开发是Web开发的两个方向 前端开发主要负责实现用户在浏览器上看到的界面和交互体验&#xff0c;包括HTML、CSS和JavaScript等技术。后端开发主要负责处理服务器端的逻辑和数据&#xff0c;包括数据库操作、服务器配置和接口开发等技术。 前端开发 前端开发需…...

基于 SpringBoot+Vue 的教室人事档案管理系统

1 简介 教师人事档案管理系统利用信息的合理管理&#xff0c;动态的、高效的、安全的实现了教师的各种需求&#xff0c;改变了传统的网上查看方式&#xff0c;使教师可以足不出户的在线查看最适合自己个人档案、奖惩信息、档案变动、培训报名或者新闻资讯。 1、教师后台功能模…...

手机如何创建网站/优化系统软件

sudo yum install expect#!/usr/bin/expect set timeout 3 spawn ssh root192.168.234.249 expect "*password*" send "123456\r" send "sudo -s\r" send "cd /data/logs\r" interact...

漯河做网站/网络小说网站三巨头

所以情况就是这样&#xff1a;我正在创建一个多人游戏,我希望我的朋友……,能够为它创建机器人.所以我要做的是创建一个抽象类Bot {},并为机器人定义函数,然后他们必须实现它们&#xff1a;非常简单.我被卡住了,之后如何添加它们&#xff1f;您可以使用反射或类似的东西来找到B…...

网页设计图片大小怎么改/有必要买优化大师会员吗

Hive作为大数据领域常用的数据仓库组件&#xff0c;在平时设计和查询时要特别注意效率。影响Hive效率的几乎从不是数据量过大&#xff0c;而是数据倾斜、数据冗余、job或I/O过多、MapReduce分配不合理等等。对Hive的调优既包含对HiveQL语句本身的优化&#xff0c;也包含Hive配置…...

网站左边logo图标怎么做/苏州网站维护

一、jQuery概述 宗旨: Write Less, Do More. 基础知识&#xff1a; 1.符号$代替document.getElementById()函数 2.使用CssXpath来查询页面元素 3.适当的混用jQuery、Dom和JavaScript能够提升程序的执行效率。 如&#xff1a;Offset、App…...

网站开发公司名单/最新消息今天的新闻

Windows》Customize Perspective》Command Groups Availability选项卡&#xff0c;左边的Available command groups 下的Android 开头的那几个都打上勾&#xff0c;然后ok就好了...

福田欧曼价格/网站推广优化招聘

Topshelf是一个开源的跨平台的宿主服务框架&#xff0c;只需要几行代码就可以构建一个很方便使用的windows服务。 首先安装nuget包 Topshelf。 创建一个.net core控制台程序 1 static void Main(string[] args)2 {3 #region 容器注入4 var services …...