Java注解(Annotation)

一、注解的定义

  • 核心概念
    注解是Java中一种特殊形式的“元数据”,用于为类、方法、字段、参数等代码元素附加说明信息。它不会直接影响代码逻辑,但可以通过编译器、框架或反射机制进行解析和处理。

  • 与注释(Comment)的区别

    • 注释:仅供开发者阅读,编译器忽略。
    • 注解:携带可被程序读取的结构化数据(如配置、校验规则等)。

二、Java内置的核心注解

Java提供了一些基础注解,分为两类:

  1. 元注解(Meta-Annotation)
    用于定义其他注解的行为:

    • @Retention:指定注解的保留范围(源码、Class文件、运行时)。
       
      @Retention(RetentionPolicy.RUNTIME) // 运行时可通过反射读取 public @interface MyAnnotation {} 
    • @Target:限制注解可应用的位置(类、方法、字段等)。
       
      @Target(ElementType.METHOD) // 只能标注在方法上 public @interface LogExecutionTime {} 
    • @Documented:注解是否出现在JavaDoc中。
    • @Inherited:是否允许子类继承父类的注解。
    • @Repeatable(Java 8+):允许同一位置重复使用注解。
  2. 功能型注解

    • @Override:标记方法重写父类或接口方法(编译器校验)。
    • @Deprecated:标记过时的代码元素(编译时警告)。
    • @SuppressWarnings:抑制编译器警告(如@SuppressWarnings("unchecked"))。
    • @FunctionalInterface(Java 8+):声明接口为函数式接口。

三、自定义注解

通过@interface关键字定义注解:

 
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface AuthRequired { String role() default "user"; // 注解属性(可设置默认值) int priority() default 1; } 
  • 属性类型:仅支持基本类型、String、Class、枚举、注解及其数组。
  • 默认值:通过default关键字指定。

四、注解的处理方式

  1. 反射处理(Runtime)
    通过反射API(如getAnnotation())在运行时解析注解:

     
    Method method = obj.getClass().getMethod("myMethod"); if (method.isAnnotationPresent(AuthRequired.class)) { AuthRequired auth = method.getAnnotation(AuthRequired.class); String requiredRole = auth.role(); // 权限校验逻辑... } 
  2. 编译时处理
    使用注解处理器(AbstractProcessor)在编译期生成代码或校验逻辑(如Lombok)。

  3. 框架集成

    • Spring@Autowired(依赖注入)、@RequestMapping(定义HTTP端点)。
    • Hibernate@Entity(标记JPA实体类)、@Column(映射数据库字段)。
    • JUnit@Test(标记测试方法)。

五、典型应用场景

  1. 配置简化
    Spring Boot的@SpringBootApplication整合多个配置注解。

  2. 代码生成
    Lombok的@Data自动生成Getter/Setter和构造函数。

  3. 数据校验
    JSR-303规范的@NotNull@Size注解结合Hibernate Validator。

  4. API文档生成
    Swagger的@ApiOperation生成接口文档。


六、最佳实践

  1. 明确目标
    避免过度使用注解,优先保持代码可读性。
  2. 结合工具链
    如通过注解处理器生成代码(减少模板代码)。
  3. 兼容性
    注意注解的保留策略(如RUNTIME注解可能影响性能)。

示例代码:自定义权限校验注解

 
// 定义注解 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface RequiresRole { String value() default "user"; } // 使用注解 public class UserController { @RequiresRole("admin") public void deleteUser(String userId) { // 删除用户逻辑... } } // 通过AOP或拦截器处理注解 @Aspect public class RoleCheckAspect { @Before("@annotation(RequiresRole)") public void checkRole(JoinPoint joinPoint) { Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); RequiresRole annotation = method.getAnnotation(RequiresRole.class); String requiredRole = annotation.value(); // 校验当前用户角色是否匹配... } } 

通过注解,Java实现了配置、逻辑和元数据的高度解耦,极大提升了代码的可维护性和扩展性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tauri2+typescript+vue+vite+leaflet等的简单联合使用(一)

项目目标 主要的目的是学习tauri。 流程 1、搭建项目 2、简单的在项目使用leaflet 3、打包 准备项目 环境准备 废话不多说,直接开始 需要有准备能运行Rust的环境和Node,对于Rust可以参考下面这位大佬的文章,Node不必细说。 Rust 和…

深入解析 Svelte:下一代前端框架的革命

深入解析 Svelte:下一代前端框架的革命 1. Svelte 简介 Svelte 是一款前端框架,与 React、Vue 等传统框架不同,它采用 编译时(Compile-time) 方式来优化前端应用。它不像 React 或 Vue 依赖虚拟 DOM,而是…

关于流水线的理解

还是不太理解,我之前一直以为,对axis总线,每一级的寄存器就像fifo一样,一级一级的分级存储最后一级需要的数据。 像这张图,一开始是在解析axis流形式的数据包,数据包一直都能输入,所以valid一直…

Python代码之美:从规范到艺术

基础规范:代码的"颜值"很重要 👉大礼包🎁:👈 PEP 8:不只是规范,是写作艺术 良好的代码格式就像优美的书法,让人赏心悦目。比如: # 不推荐的写法 def calcul…

【AI+智造】在阿里云Ubuntu 24.04上部署DeepSeek R1 14B的完整方案

作者:Odoo技术开发/资深信息化负责人 日期:2025年2月28日 一、部署背景与目标 DeepSeek R1作为国产大语言模型的代表,凭借其强化学习驱动的推理能力,在复杂任务(如数学问题、编程逻辑)中表现优异。本地化部…

8 SpringBoot进阶(上):AOP(面向切面编程技术)、AOP案例之统一操作日志

文章目录 前言1. AOP基础1.1 AOP概述: 什么是AOP?1.2 AOP快速入门1.3 Spring AOP核心中的相关术语(面试)2. AOP进阶2.1 通知类型2.1.1 @Around:环绕通知,此注解标注的通知方法在目标方法前、后都被执行(通知的代码在业务方法之前和之后都有)2.1.2 @Before:前置通知,此…

【react】快速上手基础教程

目录 一、React 简介 1.什么是 React 2.React 核心特性 二、环境搭建 1. 创建 React 项目 2.关键配置 三、核心概念 1. JSX 语法 表达式嵌入 样式处理 2. 组件 (Component) 3. 状态 (State) 与属性 (Props) 4. 事件处理 合成事件(SyntheticEvent) 5. …

七星棋牌 6 端 200 子游戏全开源修复版源码(乐豆 + 防沉迷 + 比赛场 + 控制)

七星棋牌源码 是一款运营级的棋牌产品,覆盖 湖南、湖北、山西、江苏、贵州 等 6 大省区,支持 安卓、iOS 双端,并且 全开源。这个版本是 修复优化后的二开版本,新增了 乐豆系统、比赛场模式、防沉迷机制、AI 智能控制 等功能&#…

【人工智能】Deepseek 与 Kimi 联袂:重塑 PPT 创作,开启智能演示新纪元

我的个人主页 我的专栏:人工智能领域、java-数据结构、Javase、C语言,希望能帮助到大家!!!点赞👍收藏❤ 前言 在当今快节奏的工作与学习场景中,PPT 制作常常是一项耗时耗力的任务。从前期的资…

Kafka的高水位、低水位是什么概念?

Kafka 的 高水位(High Watermark, HW) 和 低水位(Low Watermark, LW) 是和数据存储、消费进度、日志清理等密切相关的重要概念。我们用一个 “蓄水池” 的比喻来形象地解释它们的作用。 1. Kafka 里的数据像一个蓄水池 Kafka 的数…

基于JAVA+Spring+mysql_快递管理系统源码+设计文档

文末获取源码数据库文档 感兴趣的可以先收藏,有毕设问题,项目以及论文撰写等问题都可以和博主沟通,尽最大努力帮助更多的人! 摘 要 随着物流行业信息化的深入使得物流过程中货物的状态和变化透明化,现代信息化的接入使…

Python----数据分析(Numpy:安装,数组创建,切片和索引,数组的属性,数据类型,数组形状,数组的运算,基本函数)

一、 Numpy库简介 1.1、概念 NumPy(Numerical Python)是一个开源的Python科学计算库,旨在为Python提供 高性能的多维数组对象和一系列工具。NumPy数组是Python数据分析的基础,许多 其他的数据处理库(如Pandas、SciPy)都依赖于Num…

【SQL】MySQL中的字符串处理函数:concat 函数拼接字符串,COALESCE函数处理NULL字符串

MySQL中的字符串处理函数:concat 函数 一、concat ()函数 1.1、基本语法1.2、示例1.3、特殊用途 二、COALESCE()函数 2.1、基本语法2.2、示例2.3、用途 三、进阶练习 3.1 条件和 SQL 语句3.2、解释 一、concat &…

windows下适用msvc编译ffmpeg 适用于ffmpeg-7.1

需要的工具: visual studio 2019 (可以是其他版本,只是本人电脑上装的为2019) msys2 ffmpeg-7.1源码 1. 修改msys2_shell.cmd 在msys2目录修改msys2_shell.cmd 打开后找到行set MSYS2_PATH_TYPEinherit 删除开头的rem 2. 运行msys2 运行x64 Native Tools Command …

2025年软考报名费用是多少?全国费用汇总!

软考报名时间终于确定了!想要参加2025年软考的同学们注意啦!特别是那些一年只有一次考试机会的科目,千万不要错过哦!这里为大家整理了各地的报名时间、科目、费用等信息,快来看看吧! 一、2025年软考时间安…

【LeetCode459】重复的子字符串

题目描述 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 思路与算法 关键词:利用字符串的重复性质;字符串的拼接技巧;逆推法假设原始字符串 s 是由某个子串 sub 重复多次构成的。也就是说&#xff0c…

JAVA面试常见题_基础部分_Dubbo面试题(上)

Dubbo 支持哪些协议,每种协议的应用场景,优缺点? • dubbo: 单一长连接和 NIO 异步通讯,适合大并发小数据量的服务调用,以及消费者远大于提供者。传输协议 TCP,异步,Hessian 序列化…

掌握Git:从入门到精通的完整指南

Git是什么? Git是一个分布式版本控制系统,最初由Linus Torvalds在2005年为管理Linux内核开发而创建 它的主要功能是跟踪文件的更改,协调多个开发者之间的工作,并帮助团队高效地管理项目代码。Git不仅适用于大型开源项目&#xf…

数据安全_笔记系列05:数据合规与隐私保护(GDPR、CCPA、中国《数据安全法》)深度解析

数据安全_笔记系列05:数据合规与隐私保护(GDPR、CCPA、中国《数据安全法》)深度解析 在全球数据跨境流动和隐私保护强监管的背景下,企业需同时满足多法域合规要求。以下从 法规要点、核心差异、实施策略、跨境传输、典型案例 等维…

StableDiffusion打包 项目迁移 项目分发 1

文章目录 SD项目迁移前置知识webui-user.batwebui.batlaunch_utils.py 下一篇开始实践 SD项目迁移 显卡驱动更新:https://www.nvidia.cn/geforce/drivers/ 下载安装三个程序: python3.10.6: https://www.python.org/downloads/release/python-3106/gi…