注解【开发实践】

文章目录

    • 一、注解概述
      • 1.1 什么是注解
      • 1.2 注解的作用
      • 1.3 一些特殊的注解
    • 二、元注解
      • 2.1 @Retention
      • 2.2 @target
      • 2.3 @Documented
      • 2.4 @Inherited
      • 2.5 @Repeatable
    • 三、注解的使用
      • 3.1 定义注解
      • 3.2 编写注解处理器
      • 3.3 注册注解处理器

一、注解概述

1.1 什么是注解

注解(Annotation)是编程语言中的一种元数据形式,它提供了一种机制,可以在不直接影响程序代码执行逻辑的情况下,向源代码中添加信息。注解不会直接改变程序的行为,而是作为一种标记或指令,供编译器、开发工具或运行时环境解析和使用,以实现特定的功能或处理。

简单来说,使用注解标注相当于在代码的某个位置打上标签,标签上有一些元数据,仅此而已。注解本身不改变程序行为,需要通过自定义的注解处理器来扫描注解,并在扫描到注解后进行预设的处理。

1.2 注解的作用

  • 生成文档:注解可以用来生成API文档,如Java中的@param、@return等,帮助自动生成详细的文档说明。
  • 编译时检查:例如,@Override注解告诉编译器该方法意在重写超类的方法,如果实际上没有匹配的方法,则编译器会报错。
  • 编译时处理:注解处理器可以在编译阶段读取注解信息,并据此生成额外的源代码或资源文件,如Lombok的@Data自动为类生成getter和setter方法。
  • 运行时处理:某些注解在程序运行时会被解析,用于动态地决定程序行为,如Spring框架中使用注解来配置依赖注入、事务管理等。
  • 代码分析和框架集成:注解可以帮助工具和框架识别代码结构,如单元测试框架识别测试方法,或IDE识别需要特殊处理的代码块。

1.3 一些特殊的注解

标记注解:没有元素的注解。
单值注解:只有一个元素的注解,设置元素值时可以省略元素名。
元注解:作用于注解的注解。
容器注解:为定义可重复使用注解而定义的辅助注解。

二、元注解

元注解是Java中一种特殊的注解,它们主要用于注解其他的注解,为这些注解提供元数据级别的信息,如生命周期、目标位置、是否可继承等。Java自身定义了几个标准的元注解,它们位于java.lang.annotation包中。

2.1 @Retention

指定被修饰的注解的保留策略,即指定注解的生命周期。它有一个枚举类型的参数RetentionPolicy,可选值有:

  • SOURCE:注解只保留在源码中,编译时会被忽略。
  • CLASS(默认):注解会保留在class文件中,但运行时不会被虚拟机保留,因此无法在运行时通过反射访问。
  • RUNTIME:注解会保留在class文件中,并且能通过反射在运行时访问。

2.2 @target

限定被修饰的注解能够应用到哪些程序元素上。它的参数是一个枚举类型ElementType,可选值包括TYPE(类,接口,枚举)、METHOD(方法)、FIELD(字段)、PARAMETER(参数)、CONSTRUCTOR(构造器)、LOCAL_VARIABLE(局部变量)、ANNOTATION_TYPE(注解)、PACKAGE(包)等。

如果想将注解用于与多种程序元素上,可以使用多个值,这些值之间使用逗号隔开。默认情况下(没有指定时)可以应用于上述所有程序元素。

2.3 @Documented

标记被修饰的注解,使其在生成JavaDoc文档时包含进去。

简单来说,如果一个注解被@Documented修饰,那么这个注解所标注的元素的API文档中将展示这个注解,否则不会展示。

2.4 @Inherited

标记一个注解,表示该注解支持子类继承(仅对类继承有效,不适用于接口继承)。当一个类上加了该注解后,该注解也会隐式地应用于这个类的所有子类。

2.5 @Repeatable

表示某个注解可以重复使用在同一个目标上,此种注解的定义需要配合容器注解来使用,容器注解用于存储可重复注解的实例数组(详情见后)。

三、注解的使用

3.1 定义注解

定义注解就像定义接口,但有所区别。关键字换成了@interface,实现体中类似定义"方法"的形式来定义元素:"返回值"类型即元素类型,"方法名"即元素名,注意没有参数和方法体。对于每个元素,可以使用default来设置默认值。

定义不可重复使用的注解。

public @interface MyAnnotation {// 没有默认值的情况,使用时必须提供String requiredValue();// 有默认值的情况,使用时可以不提供String optionalValue() default "Default Value";
}

定义可重复使用的注解

// 定义可重复使用的注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
// 使用@Repeatable标记,表明是可重复使用的注解,使用属性指对应的容器注解。
@Repeatable(MyAnnotations.class)
public @interface MyAnnotation {String value();
}// 定义容器注解,就是一种特殊的注解,用于存储可重复使用注解的实例数组。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyAnnotations {// 可重复使用注解的数组类型MyAnnotation[] myAnnotations();
}

3.2 编写注解处理器

编写注解处理器,需要实现javax.annotation.processing.Processor接口。最简单的实现可以继承AbstractProcessor 抽象类来实现,其中process()方法是必须实现的,负责实际的注解处理逻辑。

process的参数
annotations:注解处理器所负责的注解的集合。
roundEnvironment:提供了访问注解所应用元素的环境。

process的返回值
返回true表示该处理器已经处理了所负责的所有注解,不需要其他处理器再处理这些注解。返回false则表示后续处理器还可以尝试处理这些注解。在大多数情况下,如果处理器完成了它的工作,应该返回true。

// 指定注解处理器需要处理的注解
@SupportedAnnotationTypes("你的包名.自定义注解名")
// 指定注解处理器支持的Java语言版本。
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class MyAnnotationProcessor extends AbstractProcessor {@Overridepublic synchronized void init(ProcessingEnvironment processingEnv) {super.init(processingEnv);// 初始化处理环境,可在此处设置工具、日志等}@Overridepublic boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {// 遍历需要处理的注解for (TypeElement annotation : annotations) {// 对于每个注解,获取其标注的所有对象Set<? extends Element> annotatedElements = roundEnv.getElementsAnnotatedWith(annotation);// 遍历注解标注的对象,进行相应的处理for (Element element : annotatedElements) {...}}return true;}
}

3.3 注册注解处理器

确保你的处理器能够被Java编译器发现,通常这需要在项目的META-INF/services/javax.annotation.processing.Processor文件中声明处理器的全限定名。如果你使用的是Maven或Gradle等构建工具,通常有相应的配置方式来自动注册处理器。

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

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

相关文章

大疆2025校招内推

需要内推码的请留言哦 期待你的加入

windows@资源管理器中的地址栏@访问共享文件夹的各种方法@管理共享文件夹

文章目录 资源管理器中的地址栏可以访问什么访问共享文件夹&#x1f47a;UNC路径资源管理器打开共享文件夹纯命令行方式访问共享文件夹 共享文件夹相关操作查看所有已经共享的文件夹&#x1f47a;停止某个文件的共享 共享文件夹的访问控制补充匿名访问问题&#x1f60a;强制启用…

吴恩达深度学习笔记:机器学习策略(2)(ML Strategy (2)) 2.5-2.6

目录 第三门课 结构化机器学习项目&#xff08;Structuring Machine Learning Projects&#xff09;第二周&#xff1a;机器学习策略&#xff08;2&#xff09;(ML Strategy (2))2.5 数据分布不匹配时的偏差与方差的分析&#xff08;Bias and Variance with mismatched data di…

师从IEEE fellow|博士后加拿大阿尔伯塔大学成行

V老师指定申请加拿大&#xff0c;优先对方出资的博士后&#xff0c;如果外方无资助&#xff0c;也可以自筹经费&#xff0c;但要求必须是博士后头衔。最终我们为其落实了加拿大阿尔伯塔大学的postdoctoral fellow&#xff08;博士后研究员&#xff09;&#xff0c;尽管是无薪职…

2024亚太杯中文赛数学建模选题建议及各题思路来啦!

大家好呀&#xff0c;2024年第十四届APMCM亚太地区大学生数学建模竞赛&#xff08;中文赛项&#xff09;开始了&#xff0c;来说一下初步的选题建议吧&#xff1a; 首先定下主基调&#xff0c; 本次亚太杯推荐大家选择B题目。C题目难度较高&#xff0c;只建议用过kaiwu的队伍…

仓颉——申请内测、环境搭建、编译测试

2024年6月21日&#xff0c;华为仓颉正式公开发布。 不少同学看过仓颉白皮书后&#xff0c;都在找SDK从哪下载&#xff0c;HelloWorld怎么跑。仓颉公众号也及时发布了内测的方式&#xff0c;我也亲自走了一遍整个流程&#xff0c; 一&#xff0c;申请内测 关注“仓颉编程语言…

暗潮短视频:成都柏煜文化传媒有限公司

暗潮短视频&#xff1a;涌动的新媒体力量 在数字化时代的浪潮中&#xff0c;短视频以其独特的魅力和无限的潜力&#xff0c;迅速成为新媒体领域的一股强大力量。而在这片繁荣的短视频领域中&#xff0c;成都柏煜文化传媒有限公司“暗潮短视频”以其独特的定位和深邃的内容&…

Beyond Low-frequency Information in Graph Convolutional Networks

推荐指数: #paper/⭐⭐⭐ #paper/&#x1f4a1; 发表于:AAAI21 简称:FAGCL 问题提出背景: GCN常常使用低频信息,但是在现实中,不仅低频信息重要,高频信息页重要 如上图,随着类间链接的增加,低频信号的增强开始变弱,高频信号的增强开始增加. 作者贡献: 不仅低频信号重要,高…

智能井盖采集装置 开启井下安全新篇章

在现代城市的脉络之下&#xff0c;错综复杂的管网系统如同城市的血管&#xff0c;默默支撑着日常生活的有序进行。而管网的监测设备大多都安装在井下&#xff0c;如何给设备供电一直是一个难题&#xff0c;选用市电供电需经过多方审批&#xff0c;选用电池供电需要更换电池包&a…

MySQL表的练习

二、创建表 1、创建一个名称为db_system的数据库 create database db_system; 2、在该数据库下创建两张表&#xff0c;具体要求如下 员工表 user 字段 类型 约束 备注 id 整形 主键&#xff0c;自增长 id N…

权限控制权限控制权限控制权限控制权限控制

1.权限的分类 视频学习&#xff1a;https://www.bilibili.com/video/BV15Q4y1K79c/?spm_id_from333.337.search-card.all.click&vd_source386b4f5aae076490e1ad9b863a467f37 1.1 后端权限 1. 后端如何知道该请求是哪个用户发过来的 可以根据 cookie、session、token&a…

WIN32核心编程 - 进程操作(一) 进程基础 - 创建进程 - 进程句柄

公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 进程基础 进程的定义与概念 进程的组成 创建进程 可执行文件 CreateProces 执行流程 GetStartupInfo 进程终止 进程句柄 创建进程 打开进程 进程提权 内核模拟 回溯对象 自身进…

SD NAND时序解析

一、SD NAND时序的重要性 在SD NAND的数据传输过程中&#xff0c;时序起着至关重要的作用。正确的时序确保了数据能够准确无误地在主机和SD NAND之间传输。 二、命令与读写时序 SD NAND的通信基于命令和数据传输&#xff0c;遵循以下时序规则&#xff1a; 命令与响应交互&…

安卓常用的控件

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 在Android开发中&#xff0c;控件&#xff08;也称为视图或控件组件&#xff09;是构建用户界面的基本元素。它们…

康姿百德磁性床垫好不好,效果怎么样靠谱吗

康姿百德典雅款床垫&#xff0c;打造舒适睡眠新体验 康姿百德床垫是打造舒适睡眠新体验的首选&#xff0c;其设计能够保护脊椎健康&#xff0c;舒展脊椎&#xff0c;让您享受一夜好眠。康姿百德床垫的面料选择也非常重要&#xff0c;其细腻亲肤的针织面料给您带来柔软舒适的触…

如何在操作使用ufw设置防火墙

UFW&#xff08;简单防火墙&#xff09;是用于管理iptables防火墙规则的用户友好型前端。它的主要目标是使iptables的管理更容易。 在学习Linux的时候大家一般都会关心命令&#xff0c;Posix API和桌面等&#xff0c;很少会去了解防护墙。其实除了一些网络安全厂商提供的付费防…

交互案例:5大经典交互效果

文件格式&#xff1a;.rp&#xff08;请与班主任联系获取原型文档&#xff09; 文件名称&#xff1a;Axure交互案例&#xff1a;5大经典交互实现 文件大小&#xff1a;78.5 MB 文档内容介绍 五大经典交互包括&#xff1a; 图片手风琴 图片悬浮放大 详细说明切换 图片全屏查…

上位机GUI 第三弹

&#x1f60a; &#x1f60a; &#x1f60a; 从协议层面讲&#xff0c;地质单元相当重要&#xff0c;调试模式,我只能义命令发送的索引码作为,每个设备的区分方式,调试的情况&#xff0c;不在设备上设置任何东西&#xff0c;开机访问地址和端口就能用 因为懒&#xff0c;直接将…

【代码随想录】【算法训练营】【第55天】 [42]接雨水 [84]柱状图中最大的矩形

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 55&#xff0c;又是一个周一&#xff0c;不能再坚持~ 题目详情 [42] 接雨水 题目描述 42 接雨水 解题思路 前提&#xff1a;雨水形成的情况是凹的, 需要前中后3个元素&#xff0c;计算该元…

专业的TPM管理咨询公司有哪些特点?

专业的TPM管理咨询公司&#xff0c;作为现代企业管理和设备维护的重要合作伙伴&#xff0c;其特点不仅体现在技术能力和服务质量上&#xff0c;更在于其独特的经营理念和方法论。以下是专业TPM管理咨询公司所具备的显著特点&#xff1a; 一、全面的技术实力与深厚的行业经验 专…