做任务 网站/营销网站建站公司

做任务 网站,营销网站建站公司,微信小商店开店流程,wordpress ifanr主题Java注解(Annotation)是一种强大的元数据机制,为代码提供了附加信息,能简化配置、增强代码的可读性和可维护性。本文将深入探讨 Java 注解的相关知识。首先阐述了注解的基础概念,包括其本质、作用以及核心分类&#xf…

        Java注解(Annotation)是一种强大的元数据机制,为代码提供了附加信息,能简化配置、增强代码的可读性和可维护性。本文将深入探讨 Java 注解的相关知识。首先阐述了注解的基础概念,包括其本质、作用以及核心分类(内置注解、元注解、自定义注解)。接着深入讲解元注解,如@Target、@Retention、@Documented、@Inherited、@Repeatable等,解释了它们的用途和使用方式。还介绍了自定义注解的定义语法、属性类型限制及默认值设置,以及常见应用场景等。

本文目录

    • 一、注解基础概念
      • 1.1 本质与作用
      • 1.2 核心注解分类
    • 二、元注解详解
      • 2.1 @Target
      • 2.2 @Retention
      • 2.3 @Documented
      • 2.4 @Inherited
      • 2.5 @Repeatable
    • 三、自定义注解
      • 3.1 定义语法
      • 3.2 属性类型限制
      • 3.3 默认值
    • 四、注解处理方式
      • 4.1 编译时处理
      • 4.2 运行时处理
    • 五、常见应用场景
      • 5.1 框架配置
      • 5.2 API文档生成
      • 5.3 数据校验
      • 5.4 AOP切面编程
      • 5.5 单元测试
    • 六、工作日常实战应用
      • 6.1 接口权限控制注解
      • 6.2 基于角色的接口权限校验
    • 七、注解使用重要注意点
      • 7.1 注解继承问题
      • 7.2 默认值约束
      • 7.3 性能开销
    • 八、总结

一、注解基础概念

1.1 本质与作用

        注解本质上是元数据,它为代码提供了额外的信息,例如配置信息、标记信息或校验规则等。重要的是,注解并不直接影响代码的逻辑执行。在编译期或运行时,Java可以通过反射机制读取和处理这些注解,从而实现一些自动化的操作。

1.2 核心注解分类

  • 内置注解:Java提供了一些内置的注解,像@Override用于检查方法是否正确重写,@Deprecated用于标记某个方法或类已经废弃,@SuppressWarnings则可以抑制编译器产生的警告信息。
  • 元注解:元注解是用于定义其他注解的注解,常见的有@Target@Retention等。
  • 自定义注解:开发时可以根据具体的业务需求来定义自己的注解。


二、元注解详解

2.1 @Target

@Target注解用于指定一个注解可以应用的目标范围,它通过ElementType枚举来指定。例如:

@Target({ElementType.METHOD, ElementType.TYPE})
public @interface CustomAnnotation {}

常见的目标类型包括TYPE(类或接口)、METHOD(方法)、FIELD(字段)、PARAMETER(参数)等。

2.2 @Retention

@Retention注解定义了注解的保留策略,通过RetentionPolicy枚举来指定。有以下几种策略:

  • SOURCE:注解仅在源码级别存在,编译后会被丢弃,例如@Override
  • CLASS:注解会保留到字节码文件中,但在运行时不可见(默认策略)。
  • RUNTIME:注解在运行时可以通过反射机制读取,例如Spring的@Autowired

2.3 @Documented

@Documented注解用于标记一个注解是否应该包含在Javadoc中。

2.4 @Inherited

@Inherited注解允许子类继承父类的注解,但需要注意的是,它仅对类有效,对方法和字段无效。

2.5 @Repeatable

@Repeatable注解允许在同一位置重复使用同一个注解,不过需要配合一个容器注解一起使用。示例如下:

@Repeatable(Authorities.class)
public @interface Authority {String value();
}public @interface Authorities {Authority[] value();
}



三、自定义注解

3.1 定义语法

自定义注解使用@interface关键字来定义,例如:

public @interface Loggable {String module() default "log"; // 属性可设默认值boolean enable() default true;
}

3.2 属性类型限制

注解的属性类型有一定的限制,仅支持基本类型、StringClass、枚举、其他注解以及它们的数组。

3.3 默认值

可以通过default关键字为注解的属性指定默认值。如果一个属性没有默认值,那么在使用该注解时必须为其赋值。


四、注解处理方式

4.1 编译时处理

在编译时,可以使用APT(Annotation Processing Tool)来处理注解并生成代码。例如,Lombok的@Data注解就是通过APT来生成getter、setter等方法的。要实现编译时注解处理,需要实现AbstractProcessor并注册处理器。

4.2 运行时处理

在运行时,可以通过Java的反射API来读取注解信息。示例代码如下:

Method method = obj.getClass().getMethod("methodName");
if (method.isAnnotationPresent(Loggable.class)) {Loggable loggable = method.getAnnotation(Loggable.class);System.out.println(loggable.module());
}



五、常见应用场景

5.1 框架配置

在许多Java框架中,注解被广泛用于配置。例如,Spring的@Component用于标记一个类为Spring的组件,@Autowired用于自动注入依赖;JPA的@Entity用于标记一个类为实体类。

5.2 API文档生成

Swagger是一个常用的API文档生成工具,它使用@ApiOperation@ApiParam等注解来描述API接口的信息,从而自动生成详细的文档。

5.3 数据校验

Hibernate Validator提供了一系列的注解,如@NotNull@Size等,用于对数据进行校验。例如:

public class UserRegisterRequest {@NotBlank(message = "用户名不能为空")private String username;@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式错误")private String phone;@Email(message = "邮箱格式错误")private String email;
}// 在Controller层自动校验
@PostMapping("/register")
public ResponseEntity<?> registerUser(@Valid @RequestBody UserRegisterRequest request) {// 处理注册逻辑
}

5.4 AOP切面编程

可以使用自定义注解来标记需要进行增强的方法,然后通过AOP来实现切面编程。例如:

@Around("@annotation(com.example.Loggable)")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {// 记录方法日志return joinPoint.proceed();
}

5.5 单元测试

在单元测试中,JUnit使用@Test注解来标记一个测试方法,@BeforeEach注解用于在每个测试方法执行前执行一些初始化操作。


六、工作日常实战应用

6.1 接口权限控制注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequireRole {String[] value(); // 允许访问的角色(如"ADMIN", "USER")
}

6.2 基于角色的接口权限校验

@RestController
public class OrderController {@RequireRole({"ADMIN", "OPERATOR"}) // 仅允许管理员和运营@GetMapping("/orders")public List<Order> listAllOrders() {// 查询所有订单}// 权限校验切面@Aspect@Componentpublic static class RoleCheckAspect {@Around("@annotation(requireRole)")public Object checkRole(ProceedingJoinPoint joinPoint, RequireRole requireRole) throws Throwable {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();String userRole = (String) request.getAttribute("currentUserRole");if (!Arrays.asList(requireRole.value()).contains(userRole)) {throw new AccessDeniedException("Permission denied");}return joinPoint.proceed();}}
}



七、注解使用重要注意点

7.1 注解继承问题

默认情况下,子类不会继承父类方法上的注解。如果需要继承,需要使用@Inherited注解,并且父类注解的@Retention策略必须为RUNTIME

7.2 默认值约束

注解的属性不能为null,需要使用默认值或空字符串、空数组等来替代。

7.3 性能开销

频繁使用反射来读取运行时注解可能会影响性能,可以通过缓存来优化,例如:

private static final Map<Method, RequireRole> roleCache = new ConcurrentHashMap<>();public static RequireRole getRequireRole(Method method) {return roleCache.computeIfAbsent(method, m -> m.getAnnotation(RequireRole.class));
}



八、总结

        Java注解是一种强大而灵活的机制,它可以显著提升代码的可维护性和开发效率。通过深入理解注解的基础概念、元注解、自定义注解、处理方式以及应用场景,可以在实际项目中合理地运用注解帮助我们实现权限控制、日志记录、数据校验等功能。



← 上一篇 Java进阶——Stream流以及常用方法详解
记得点赞、关注、收藏哦!
下一篇 Java进阶——数据类型深入解析 →

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

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

相关文章

DeepSeek 15天指导手册——从入门到精通 PDF(附下载)

DeepSeek使用教程系列--DeepSeek 15天指导手册——从入门到精通pdf下载&#xff1a; https://pan.baidu.com/s/1PrIo0Xo0h5s6Plcc_smS8w?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/2e8de75027d3 《DeepSeek 15天指导手册——从入门到精通》以系统化学习路径为核心&…

【智能音频新风尚】智能音频眼镜+FPC,打造极致听觉享受!【新立电子】

智能音频眼镜&#xff0c;作为一款将时尚元素与前沿科技精妙融合的智能设备&#xff0c;这种将音频技术与眼镜形态完美结合的可穿戴设备&#xff0c;不仅解放了用户的双手&#xff0c;更为人们提供了一种全新的音频交互体验。新立电子FPC在智能音频眼镜中的应用&#xff0c;为音…

常用的 pip 命令

pip 是 Python 的包管理工具&#xff0c;可用于安装、卸载、更新和管理 Python 包。以下是一些常用的 pip 命令&#xff1a; 1. 安装包 安装最新版本的包 pip install package_namepackage_name 是你要安装的 Python 包的名称&#xff0c;例如 pip install requests 可以安装…

学习threejs,使用ShaderMaterial自定义着色器材质

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.ShaderMaterial1.1.1…

Typora的Github主题美化

[!note] Typora的Github主题进行一些自己喜欢的修改&#xff0c;主要包括&#xff1a;字体、代码块、表格样式 美化前&#xff1a; 美化后&#xff1a; 一、字体更换 之前便看上了「中文网字计划」的「朱雀仿宋」字体&#xff0c;于是一直想更换字体&#xff0c;奈何自己拖延症…

神经网络 - 激活函数(Sigmoid 型函数)

激活函数在神经元中非常重要的。为了增强网络的表示能力和学习能力&#xff0c;激活函数需要具备以下几点性质: (1) 连续并可导(允许少数点上不可导)的非线性函数。可导的激活函数可以直接利用数值优化的方法来学习网络参数. (2) 激活函数及其导函数要尽可能的简单&#xff0…

Docker容器日常维护常用命令大全

友情提示&#xff1a;本文内容由银河易创&#xff08;https://ai.eaigx.com&#xff09;AI创作平台deepseek-v3模型生成&#xff0c;文中所有命令未进行验证&#xff0c;仅供参考。请根据具体情况和需求进行适当的调整和验证。 引言 Docker作为当前最流行的容器化技术&#xf…

Pytest测试用例执行跳过的3种方式

文章目录 1.前言2.使用 pytest.mark.skip 标记无条件跳过3.使用 pytest.mark.skipif 标记根据条件跳过4. 执行pytest.skip()方法跳过测试用例 1.前言 在实际场景中&#xff0c;我们可能某条测试用例没写完&#xff0c;代码执行时会报错&#xff0c;或者是在一些条件下不让某些…

GitHub 语析 - 基于大模型的知识库与知识图谱问答平台

语析 - 基于大模型的知识库与知识图谱问答平台 GitHub 地址&#xff1a;https://github.com/xerrors/Yuxi-Know &#x1f4dd; 项目概述 语析是一个强大的问答平台&#xff0c;结合了大模型 RAG 知识库与知识图谱技术&#xff0c;基于 Llamaindex VueJS FastAPI Neo4j 构…

【Prometheus】prometheus服务发现与relabel原理解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

004-利用Docker安装Mysql

利用Docker安装Mysql 一、在镜像仓库找到 Mysql1.镜像仓库地址2.复制命令3.下载Mysql镜像4.查看镜像 二、创建实例并启动三、用本地工具连接数据库四、设置 Mysql 配置 一、在镜像仓库找到 Mysql 1.镜像仓库地址 https://hub.docker.com 2.复制命令 docker pull mysql:8.0…

当JMeter遇见AI:性能测试进入智能时代(附实战案例)

性能测试作为软件开发中的关键环节&#xff0c;确保系统在高负载下仍能高效运行。JMeter 是一种广泛使用的开源工具&#xff0c;用于负载测试和性能测量&#xff0c;但传统方法往往效率低下。AI 的引入&#xff0c;为性能测试带来了智能化升级。本文将探讨 JMeter 与 AI 的结合…

DeepSeek R1 + 飞书机器人实现AI智能助手

效果 TFChat项目地址 https://github.com/fish2018/TFChat 腾讯大模型知识引擎用的是DeepSeek R1&#xff0c;项目为sanic和redis实现&#xff0c;利用httpx异步处理流式响应&#xff0c;同时使用buffer来避免频繁调用飞书接口更新卡片的网络耗时。为了进一步减少网络IO消耗&…

多样化的化学结构式表示法

化学结构式是用元素符号和短线表示化合物&#xff08;或单质&#xff09;分子中原子的排列和结合方式的式子&#xff0c;它具有多方面的重要含义&#xff0c;具体如下&#xff1a; 表示原子组成及种类体现原子的连接顺序和方式反映分子的空间构型揭示化学性质和反应机理用于化…

Vmvare虚拟机使用代理

1. 宿主机配置 宿主机配置好网络&#xff0c;能访问google&#xff0c;然后开启局域网代理 记录下宿主机的真实网卡的ip地址及代理服务的端口号 例如 192.168.101.120:52209 2. 虚拟机配置 vmvare网络连接设置 虚拟机网络连接选择nat模式 终端环境变量设置 终端只需设置以下…

Claude 3.7 Sonnet深度解析:混合推理模型如何重塑AI编程能力

引言 2025年2月25日&#xff0c;人工智能领域领先企业Anthropic正式发布了新一代大语言模型Claude 3.7 Sonnet。作为全球首个混合推理AI模型&#xff0c;Claude 3.7 Sonnet在编程开发、逻辑推理以及任务处理效率等方面实现了突破性进展。本文将从核心特性、性能评测、竞品对比…

USRP6330-通用软件无线电平台

1、产品描述 USRP6330平台以XILINX XCZU15EG SOC处理器为核心&#xff0c;搭配两片ADI ADRV9026射频集成芯片&#xff0c;提供了瞬时带宽高达200MHz的8收8发射频通道。通过驯服的高精度GPSDO时钟参考方案&#xff0c;USRP可以支持高性能的MIMO通信系统&#xff0c;提供了部署大…

26.[前端开发-JavaScript基础]Day03-循环语句

一、JavaScript循环语句 1 认识循环语句 认识循环 2 while循环 while循环 while循环的练习 3 do..while循环 do..while循环 4 for循环(循环嵌套 ) for循环 for循环的练习 for循环的嵌套 5 break 、continue 循环控制 6 综合案例练习 猜数字游戏 循环的总结

一文弄懂TCP断开连接时候的四次挥手

部分内容来源&#xff1a;小林coding TCP四次挥手过程是怎样的 天下没有不散的宴席&#xff0c;对于 TCP 连接也是这样&#xff0c; TCP 断开连接是通过四次挥手方式 双方都可以主动断开连接&#xff0c;断开连接后主机中的「资源」将被释放&#xff0c;四次挥手的过程如下图…

小程序画带圆角的圆形进度条

老的API <canvas id"{{canvasId}}" canvas-id"{{canvasId}}" style"opacity: 0;" class"canvas"/> startDraw() {const { canvasId } this.dataconst query this.createSelectorQuery()query.select(#${canvasId}).bounding…