注解的定义
一、理论说明
1. 注解的定义
Java 注解是从 JDK 5.0 开始引入的一种元数据机制,它可以为代码添加额外的信息,这些信息不影响程序的运行逻辑,但可以在编译期、类加载期或运行期被读取和处理。注解本质上是一种特殊的接口,所有注解都自动继承java.lang.annotation.Annotation
接口。注解可以应用于类、方法、字段、参数等程序元素上,用于实现如代码检查、配置信息、生成文档等功能。
2. 内置注解与自定义注解的区别
- 定义方式:
- 内置注解是 Java 语言自带的,在
java.lang
、java.lang.annotation
等包中已经定义好,例如@Override
、@Deprecated
、@SuppressWarnings
等,开发者可以直接使用。 - 自定义注解需要开发者自己使用
@interface
关键字来定义新的注解类型,通过元注解(如@Retention
、@Target
等)来指定注解的保留策略和适用范围 。
- 内置注解是 Java 语言自带的,在
- 功能特性:
- 内置注解具有特定的、固定的功能。比如
@Override
用于确保方法正确重写父类方法,编译器会进行检查;@Deprecated
用于标记不建议使用的代码元素,提醒开发者避免使用 。 - 自定义注解功能更加灵活,开发者可以根据具体需求定义注解的属性和处理逻辑,用于实现特定的业务逻辑,如自定义的权限控制、数据校验等。
- 内置注解具有特定的、固定的功能。比如
- 使用场景:
- 内置注解适用于通用的、常见的代码标注场景,是 Java 语言为了提高代码质量和开发效率提供的基础工具 。
- 自定义注解适用于项目中特定的、个性化的需求,例如在 Web 开发中定义注解来处理请求日志记录、在持久化层定义注解来映射数据库表结构等。
二、常用注解与元注解
1. 内置常用注解
@Override
用于标识一个方法是重写父类的方法。如果被注解的方法并非真正重写父类方法,编译器会报错。例如:
class Animal {public void speak() {System.out.println("动物发出声音");}
}class Dog extends Animal {@Overridepublic void speak() {System.out.println("狗汪汪叫");}
}
@Deprecated
用于标记不再建议使用的类、方法或字段。当其他开发者使用被该注解标记的元素时,编译器会给出警告。例如:
@Deprecated
public void oldMethod() {System.out.println("这是一个不再建议使用的方法");
}
@SuppressWarnings
用于抑制编译器产生的警告信息。可以通过指定警告类型,如unchecked
(抑制未检查类型转换警告)、deprecation
(抑制使用已过时元素的警告)等。例如:
import java.util.ArrayList;
import java.util.List;public class Main {@SuppressWarnings("unchecked")public static void main(String[] args) {List list = new ArrayList();list.add("元素");}
}
2. 元注解
@Retention
用于指定注解的保留策略,即注解在什么阶段还存在。@Retention
有三个取值:
四、面试题
题目:
答案:
五、自我总结
通过对 Java 注解的学习,我们掌握了一种强大且灵活的元数据添加方式。内置注解在日常开发中能有效提高代码质量和规范性,而自定义注解结合元注解,为满足个性化业务需求提供了有力工具。掌握@Override
、@Deprecated
、@SuppressWarnings
等内置注解,以及@Retention
、@Target
等元注解的使用,能让我们在实际编程中根据不同场景合理运用注解。在实际应用场景中,如代码规范检查、框架配置、日志记录等方面,注解都能发挥重要作用。合理使用注解不仅可以使代码结构更清晰,还能提高代码的可维护性和扩展性,在大型项目开发和框架设计中具有重要意义 。
RetentionPolicy.SOURCE
:注解只保留在源文件中,编译成字节码文件时就会被丢弃,例如@Override
注解。RetentionPolicy.CLASS
:注解保留在字节码文件中,但在运行时无法获取,这是默认的保留策略。RetentionPolicy.RUNTIME
:注解不仅保留在字节码文件中,在运行时也可以通过反射获取和处理。例如:import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME) @interface MyRuntimeAnnotation {}
@Target
用于指定注解可以应用的程序元素类型,如类、方法、字段等。
@Target
的取值包括:ElementType.TYPE
:应用于类、接口、枚举等类型。ElementType.METHOD
:应用于方法。ElementType.FIELD
:应用于字段。
例如:import java.lang.annotation.ElementType; import java.lang.annotation.Target;@Target(ElementType.METHOD) @interface MyMethodAnnotation {}
三、应用实例
以下代码展示了自定义注解及其使用和处理:
import java.lang.annotation.*; import java.lang.reflect.Method;// 定义自定义注解 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @interface Loggable {String value() default ""; }class Calculator {@Loggable("执行加法运算")public int add(int a, int b) {return a + b;}public int subtract(int a, int b) {return a - b;} }public class Main {public static void main(String[] args) throws NoSuchMethodException {Calculator calculator = new Calculator();Method addMethod = calculator.getClass().getMethod("add", int.class, int.class);if (addMethod.isAnnotationPresent(Loggable.class)) {Loggable loggable = addMethod.getAnnotation(Loggable.class);System.out.println("注解信息: " + loggable.value());}int result = calculator.add(3, 5);System.out.println("计算结果: " + result);} }
代码解释
- 定义自定义注解:使用
@interface
关键字定义Loggable
注解,通过@Retention(RetentionPolicy.RUNTIME)
指定该注解在运行时可用,@Target(ElementType.METHOD)
指定该注解只能应用于方法上,同时定义了一个value
属性。 - 使用注解:在
Calculator
类的add
方法上使用@Loggable
注解,并设置value
属性为 “执行加法运算” 。 - 处理注解:在
main
方法中,通过反射获取add
方法,使用isAnnotationPresent
方法检查该方法是否存在Loggable
注解。如果存在,则使用getAnnotation
方法获取注解实例,并输出注解的value
属性值,最后调用add
方法进行计算并输出结果。
相关文章:
注解的定义
一、理论说明 1. 注解的定义 Java 注解是从 JDK 5.0 开始引入的一种元数据机制,它可以为代码添加额外的信息,这些信息不影响程序的运行逻辑,但可以在编译期、类加载期或运行期被读取和处理。注解本质上是一种特殊的接口,所有注解…...
企业微信自建消息推送应用
企业微信自建应用来推送消息 前言 最近有个给特定部门推送消息的需求,所以配置一个应用专门用来推送消息。实现过程大致为:服务器生成每天的报告,通过调用API来发送消息。以前一直都是发邮件,整个邮箱里全是报告文件,…...
swagger3融入springboot
标签: 放controller上面 Api(description "xxx") 放方法上面 Operation(summary "xxx") 引入: 我用的是swagger3.X 需要在yml配置文件中加上: spring:mvc:pathmatch:matching-strategy: ant_path_matcher 然后生…...
CH32V208GBU6沁恒绑定配对获取静态地址
从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…...
[计算机科学#11]:编程语言简史,从二进制到简约表达的华丽转身,造就原因——“懒”
【核知坊】:释放青春想象,码动全新视野。 我们希望使用精简的信息传达知识的骨架,启发创造者开启创造之路!!! 内容摘要: 由于早期的编程需要直接操作硬件,例如使…...
Kubernetes HPA 深度解析:生产环境自动扩缩容实战指南
一、HPA 核心原理剖析 1. 运作机制三步曲 (图示:指标采集 → 决策计算 → 执行扩缩容的完整闭环) 指标采集层:通过 Metrics Server/Prometheus 等组件实时收集 CPU、内存或自定义指标决策计算层:根据当前指标值与目标阈值的比例计算所需副本…...
Matlab 四分之一车体被动和模糊控制对比
1、内容简介 Matlab215-四分之一车体被动和模糊控制对比 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
pm2如何执行脚本批量启动多个服务
在 PM2 中批量启动多个服务,可以通过以下几种高效方式实现,具体操作如下: 方法1:使用 ecosystem.config.js 配置文件(推荐) 步骤1:生成配置文件 在项目根目录运行以下命令,生成模板…...
Debian系统详解
以下是关于 Debian 操作系统 的超详细深度解析,涵盖历史、架构、功能特性、管理细节及应用场景等方面,帮助你全面掌握这一经典 Linux 发行版: 一、Debian 概述:开源社区的基石 1. 历史与定位 • 诞生:1993 年由 Ian…...
Dify X 奇墨科技,让AI大模型从“巨头专属”变为“触手可及”
AI大模型和AI Agent蓬勃发展,企业比拼的已不仅是AI技术储备,更是AI应用落地的实战能力。奇墨科技正式成为 AI 应用开发平台Dify中国大陆区企业版合作伙伴,帮助企业更便捷地接触到Dify并使用其开发AI应用。 Dify 是一款简单易用的 LLM 应用开…...
CSS相对定位与绝对定位
在网页设计里,相对定位(Relative Positioning)和绝对定位(Absolute Positioning)是 CSS(层叠样式表)里控制元素位置的关键手段。下面为你详细讲解它们的概念、特点与应用场景。 相对定位 概念…...
正则表达式(Regular Expression)详解
正则表达式(简称"regex"或"regexp")是一种强大的文本模式匹配工具,它使用特定语法来描述、匹配和操作字符串。 基本概念 正则表达式是由普通字符(如字母a到z)和特殊字符(称为"元…...
OpenCV-Python (官方)中文教程(部分一)_Day22
22.3 2D直方图 在前面的部分我们介绍了如何绘制一维直方图,之所以称为一维,是因为我们只考虑了图像的一个特征:灰度值。但是在 2D 直方图中我们就要考虑 两个图像特征。对于彩色图像的直方图通常情况下我们需要考虑每个的颜色(Hue)和饱和度&…...
【软考-高级】【信息系统项目管理师】【论文基础】采购管理过程输入输出及工具技术的使用方法
采购管理概念 项目采购管理包括从项目团队外部采购或获取所需产品、服务或成果的各个过程。项目采购管理包括编制和管理协议所需的管理和控制过程,例如合同、订购单、协议备忘录(MOA)和服务水平协议(SLA)。 采购管理…...
基于STM32、HAL库的CP2102-GMR USB转UART收发器 驱动程序设计
一、简介: CP2102-GMR是Silicon Labs公司生产的一款USB转UART桥接芯片,主要特点包括: 集成USB 2.0全速功能控制器 内置USB收发器,无需外部电阻 工作电压:3.0V至3.6V 支持的数据格式:数据位8,停止位1,无校验 最高支持1Mbps的波特率 内置512字节接收缓冲区和512字节发送…...
信息系统项目管理工程师备考计算类真题讲解十四
一、最小生成树问题 此问题采用破圈法来解决, 1)以1节点为例,找到路径最小 点:1--5:距离为3 2)找1--5最短的节点,选择4:1--5--4:距离为:5 3)找…...
二叉树的基本操作
二叉树的基本操作(C 语言版) 1 二叉树的定义 二叉树的图长这样: 二叉树是每个结点最多有两个子树的树结构,常被用于实现二叉查找树和二叉堆。二叉树是链式存储结构,用的是二叉链,本质上是链表。二叉树通常以结构体的形式定义,如下,结构体内容包括三部分:本节点所存储…...
网络基础入门第6-7集(抓包技术)
前言: 来自小迪安全v2023 内容: 第六集: 大致内容:burpsuit、茶杯、fiddler的抓包流程 1、安装抓包软件的相关证书 2、各大抓包软件的测试 注意用burp抓模拟器的数据包,需要将ip地址设置为本地的ip地址ÿ…...
自定义Widget开发:自定义布局实现
自定义Widget开发:自定义布局实现 一、Flutter布局系统基础 1. 布局约束(Constraints) 在Flutter中,布局系统基于约束(Constraints)的概念。每个widget都会接收来自其父widget的约束,并根据这…...
MyBatis(进阶)(xml标签)
本节⽬标 1. 学习MyBatis的动态SQL查询 2. 掌握MyBatis在项⽬中的应⽤, 可以使⽤Spring MVC完成⼀些基础的功能 1. 动态SQL(XML) 动态 SQL 是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接 可以参考官⽅⽂档: M…...
英皇娱乐X乐华娱乐携手造星!“英皇乐华青少年艺人培训班”正式启动!
2025年5月8日,英皇娱乐集团与乐华娱乐集团联合宣布,双方将在北京市燕京实验中学合作开设“英皇乐华青少年艺人培训班”,为8至18岁的青少年提供专业的演艺及才艺学习平台。此次合作旨在集合两大娱乐公司在演艺行业的资源与优势,共同…...
Linux云计算训练营笔记day04(Rocky Linux中的命令)
mv 移动(剪切) 源数据会消失 格式: mv 源文件 目标路径 touch /opt/a.txt 创建文件 mv /opt/a.txt /root 移动文件,没有改名 mkdir gongli 创建目录 mv gongli /opt/ 移动目录,没有改名 mv /opt/gongli tedu 移动目录,改名了 …...
枚举 · 例13-【模板】双指针
登录—专业IT笔试面试备考平台_牛客网 代码区: #include<algorithm> #include<iostream> #include<vector> #include<unordered_set> using namespace std;struct INTER{int left,right; }; bool compare(const INTER&a,const INTER&a…...
Linux网络编程day7 线程池and UDP
线程池 typedef struct{void*(*function)(void*); //函数指针,回调函数void*arg; //上面函数的参数 }threadpool_task_t; //各子线程任务的结构体/*描述线程池相关信息*/struct threadpool_t{pthread_mutex_t lock; …...
WHAT - ahooks vs swr 请求
文章目录 ahooks特点常用 Hooks 示例1. useRequest — 封装网络请求逻辑(比 SWR / React Query 更轻量)2. useDebounce — 防抖值3. useLocalStorageState — 本地存储的状态4. useBoolean — 快速管理布尔状态5. useEventListener — 添加事件监听 ahoo…...
算法训练营第十一天|150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素
150. 逆波兰表达式求值 题目 思路与解法 第一思路: 比较简单 class Solution:def evalRPN(self, tokens: List[str]) -> int:stack []for item in tokens:if item ! and item ! - and item ! * and item ! / :stack.append(item)else:b int(stack.pop())a …...
可视化图解算法35:在二叉树中找到两个节点的最近公共祖先(二叉树的最近公共祖先)
1. 题目 描述 给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。 数据范围:树上节点数满足 1≤n≤105 , 节点值val满足区间 [0,n) 要求:时间复杂度 O(n) 注:本题保…...
如果说开启的TIM3定时器有ccr1,ccr2,ccr3,我想要关闭ccr2的PWM输出,怎么通过代码实现
目录 作用概述: 具体原理: 代码的操作细节: 实际效果: 示意全文: 小结: TIM3->CCER & ~TIM_CCER_CC2E; 作用概述: 作用是禁用 TIM3 的通道 2(CCR2)的捕获…...
高能数造全固态电池干法电极高品质原纤化技术:驱动干法和全固态电池制造新进程
技术背景 传统湿法电极制备工艺的局限:传统的湿法电极制备工艺需要使用大量的溶剂来溶解粘结剂和分散活性物质,后续还需要复杂的干燥工序来去除溶剂。这不仅增加了生产成本和能源消耗,溶剂的使用和处理还会带来环境污染和安全隐患。 新能源产业发展的需…...
AI驱动的制造工艺:系统化探索与创新
DeepSeek 技术全景 在当今 AI 技术蓬勃发展的时代,DeepSeek 已成为该领域中一颗耀眼的明星。自 2023 年 7 月 17 日成立以来,这家由知名私募巨头幻方量化孕育而生的公司,迅速在 AI 领域崭露头角 。DeepSeek 的目标是开发顶尖的大语言模型(LLM),并利用数据蒸馏技术打造更精…...
Mac 平台获取地区标识符号
以下是添加了详细中文注释的代码版本,解释每一行代码的作用: #include <CoreFoundation/CoreFoundation.h> #include <vector> #include <string> #include <iostream>// 将 Core Foundation 的字符串(CFStringRef)转换为标准 …...
PyTorch 实战:从 0 开始搭建 Transformer
导入必要的库 python import math import torch import torch.nn as nn from LabmL_helpers.module import Module from labml_n.utils import clone_module_List from typing import Optional, List from torch.utils.data import DataLoader, TensorDataset from torch imp…...
Java 显式锁与 Condition 的使用详解
Java 显式锁与 Condition 的使用详解 在多线程编程中,线程间的协作与同步是核心问题。Java 提供了多种机制来实现线程同步,除了传统的 synchronized 关键字外,ReentrantLock 和 Condition 是更灵活且功能强大的替代方案。本文将详细介绍显式…...
【MySQL】存储引擎 - CSV详解
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
LeetCode算法题(Go语言实现)_62
题目 有两种形状的瓷砖:一种是 2 x 1 的多米诺形,另一种是形如 “L” 的托米诺形。两种形状都可以旋转。 给定整数 n ,返回可以平铺 2 x n 的面板的方法的数量。返回对 109 7 取模 的值。 平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺不…...
矿井设备通信破局:ModbusTCP转DeviceNet网关应用实践
矿井设备通信破局:ModbusTCP转DeviceNet网关应用实践 在500米深的金属矿井中,传统人工操控采掘设备存在高风险、低效率问题。某矿业集团引入海希无线遥控器远程控制掘进机,却因通信协议冲突陷入困局:海希遥控器采用DeviceNet协议…...
GrassRoot备份项目
Windows服务项目 Grass.cs using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http.Headers; using System.Net.Http; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Time…...
多级路由器如何避免IP冲突
在多级路由器架构中,避免IP冲突的核心在于合理规划子网、正确配置路由器角色与功能。以下是综合多个搜索结果的解决方案及操作步骤: 一、划分不同子网段 修改LAN口IP地址 主路由器默认LAN口IP为192.168.1.1,次级路由器需更改为不同网段&#…...
VGGNet详解
VGGNet 由牛津大学视觉几何组(Visual Geometry Group)在2014年提出,凭借极简的 33卷积核堆叠设计 成为经典模型,影响了后续大量网络架构。 1. 网络结构 VGGNet 的核心思想是 通过多层小卷积核(33)替代大卷…...
TDengine 在新能源行业应用
简介 在当前可再生能源迅速发展的浪潮中,分布式光伏和可再生能源的装机容量已经达到相当可观的规模。尽管新能源的发展得到政策的鼎力扶持,但其并网后对电网的运行调度、供电可靠性以及系统的安全稳定带来诸多新挑战。 分布式光伏,即分布式…...
[人机交互]设计,原型建立和构造
一.建立和构造原型 1.1理解用户需要和技术之间的关系 用户需要和技术之间是一个鸡和蛋的问题 • 用户对产品的理解建立在 与该产品交互 的基础上 • 用户只有在熟悉后,才能 评价 是否需要,及 进一步 的需要 • 构造最终产品需要大量资源 • 原型化 是 …...
C#生成二维码和条形码
C# 实现二维码和条形码生成:从入门到实战 文章目录 C# 实现二维码和条形码生成:从入门到实战一、引言二、准备工作2.1 开发环境搭建2.2 引入相关库 三、生成条形码3.1 条形码基本概念3.2 使用[ZXing.Net](https://ZXing.Net)生成条形码3.2.1 核心代码实现…...
2025.5.8总结(中期审视)
今日记录: 晚上,主管找我聊了关于中期绩效审视的问题。 首先就是让我汇报上半年的工作进展,汇报完后,感觉体现不出自己的工作量,这确实考验个人的汇报能力。 汇报完工作后,主管开始给我提了一些建设性的…...
Pyinstaller编译EXE及反编译
文章目录 适用范围示例文件编译EXE反编译EXE准备工具编译pycdc反编译 反编译得到的文件相关资源下载 适用范围 实测 python3.9可以反编译。从pycdc源代码看,似乎支持到python 3.13。 示例文件 demo.py import sys from PyQt5 import QtWidgets, QtCore, QtGui c…...
3.2.3 掌握RDD转换算子 - 3. 扁平映射算子 - flatMap()
在本节课中,我们深入学习了Spark RDD的flatMap()算子。flatMap()与map()类似,但每个元素可以返回0到多个元素,最终将所有结果合并为一个RDD。通过案例演示,我们首先对单词文件进行了统计,通过map()将每行文本转换为单词…...
深入解析 C# 常用数据结构:特点、区别与优缺点分析
在软件开发中,选择合适的数据结构是提高代码效率和性能的关键。在 C# 中,我们常用的数据结构包括 List、Array、Dictionary<TKey, TValue>、HashSet、Queue、Stack 和 LinkedList。每种数据结构有不同的特点、优缺点和适用场景。本文将结合代码&am…...
LeetCode第284题 - 窥视迭代器
题目 解答一 package leetcode.editor.cn; //leetcode submit region begin(Prohibit modification and deletion) // Java Iterator interface reference: // https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.htmlimport java.util.Iterator; import java.ut…...
克里金模型+多目标优化+多属性决策!Kriging+NSGAII+熵权TOPSIS!
目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 克里金模型多目标优化多属性决策!KrigingNSGAII熵权TOPSIS!!matlab2023b语言运行! 1.克里金模型(Kriging Model)是一种基于空间统计学的插值方法…...
驱动开发硬核特训 · Day 30(下篇): 深入解析 lm48100q I2C 音频编解码器驱动模型(基于 i.MX8MP)
作者:嵌入式Jerry 视频教程请关注 B 站:“嵌入式Jerry” 一、背景与目标 在本篇中,我们围绕 TI 的 lm48100q 音频编解码器 展开,深入讲解其作为 I2C 外设如何集成至 Linux 内核音频子系统(ASoC)࿰…...
【RAG】indexing 中的 Hierarchical Indexing(分层索引)
Hierarchical Indexing(分层索引) 关键词解析: Splits (分割): 原始文档被分割成较小的块。Cluster (聚类): 将语义上相似的文档块分组在一起。Summaries (摘要): 为每个聚类或更高层次的节点生成摘要。RAPTOR (Recursive Abstractive Proc…...