Java注解与注解处理器

文章目录

  • 标注注解
  • 元注解
    • @Target
    • RetentionPolicy
  • 创建自定义注解
  • 实现注解处理器
    • AbstractProcessor 里面的Element
      • 1.TypeElement :
      • 2.VariableElement:
      • 3.ExecuteableElement:
    • 需要实现的AbstractProcessor 方法
      • 1.init()
      • 2.getSupportedSourceVersion()
      • 3.getSupportedAnnotationTypes()
      • 4.process()
  • 参考

标注注解

@Overrride:对覆盖超类中的方法进行标记,如果被标记的方法并没有实际覆盖超类中的方法,则编译器会发出警告。
@Deprecate:提示开发者该方法已经废弃,不推荐使用。
@SupperWarnings:选择性地取消特定代码中的警告。

元注解

用来标注其它注解而创建的新注解,元注解的类型有以下几种:

@Target:注解所修饰的对象范围
@Inherited:表示注解可以被继承
@Documented:表示这个注解应该被JavaDoc工具记录
@Rentation:用来声明注解的保留策略
@Repeable:JDK8新增,允许一个注解在同一声明类型(类,属性或方法)上多次使用。

@Target

其中@Target注解的取值是一个ElementType类型的枚举,其中有一下几种取值,对应不同的对象范围。
ElementType.TYPE:能修饰类,接口或者枚举类型。
ElementType.FIELD:能修饰成员变量
ElementType. METHOD:能修饰方法
ElementType. PARAMETER:能修饰参数
ElementType. CONSTRUCTOR:能修饰构造方法
ElementType.LOCAL_VARIABLE:能修饰局部变量
ElementType. ANNOTATION_TYPE:能修饰注解
ElementType. PACKAGE:能修饰包
ElementType.TYPE_PARAMETER:能修饰参数声明
ElementType.TYPE_USE:使用类型
其中@Retention注解有3种类型,分别表示不同级别的保留策略。

RetentionPolicy

RetentionPolicy.SOURCE:源码级注解,注解信息只会保留在Java源码中,源码在编译后,注解信息将会被丢弃,不会保留在.class文件中。

RetentionPolicy.CLASS:编译时注解。注解信息会保留在.java源码以及.class中。当运行java程序时,JVM会丢弃该注解信息,不会保留在JVM中,许多注解类框架,如EventBus,ButterKnife他们都是使用编译时注解信息开发的,针对编译时注解我们采用AbstractProcessor来处理注解信息。

RetentionPolicy.RUNTIME:运行注解。当运行Java程序时,JVM也会保留该注解信息,可以通过反射获取该注解信息。

创建自定义注解

首先自定义一个注解:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface MyAnnotation {String name();
}

实现注解处理器

注解处理器模块要依赖前面的注解。被注解到的方法、类或者成员变量
自定义的处理器需要继承AbstractProcessor,需要自己实现的方法如下:

public class AnnotationProcessor extends AbstractProcessor {@Overridepublic synchronized void init(ProcessingEnvironment processingEnvironment) {}@Overridepublic SourceVersion getSupportedSourceVersion() {}@Overridepublic Set<String> getSupportedAnnotationTypes() {}@Overridepublic boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {}
}

AbstractProcessor 里面的Element

Element可以拿到特定的元素类型。

1.TypeElement :

类或者接口类型

2.VariableElement:

成员变量

3.ExecuteableElement:

成员方法

需要实现的AbstractProcessor 方法

1.init()

方法可以初始化拿到一些使用的工具,比如文件相关的辅助类 Filer;
元素相关的辅助类Elements;日志相关的辅助类Messager;

2.getSupportedSourceVersion()

返回 Java 版本;

3.getSupportedAnnotationTypes()

方法返回要处理的所有注解。

4.process()

注解处理器的处理方法。想要使用注解处理器做什么,就在这里执行。

一般来说很多开源框架通过这个来生成代码,例如Java文件。然后通过生成的java文件去做各种事情,非常灵活。

通过Java生成代码的库: javapoet

那么怎么在编译的时候JVM怎么找到我们自定义的注解处理器?可以阅读下:
Java SPI (Service Provider Interface)

参考

https://www.jianshu.com/p/ac6a69adecff
https://www.jianshu.com/p/9616f4a462bd

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

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

相关文章

LangChain 9 模型Model I/O 聊天提示词ChatPromptTemplate, 少量样本提示词FewShotPrompt

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…

番外篇之矩阵运算

矩阵的运算代码&#xff08;加减乘除&#xff09;&#xff08;内有注释&#xff09; #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #define ROW 10 //定义行 #define COL 10 //定义列 //设置全局变量A矩阵的m代表实际矩阵的行数&#xff0c;n代表实际矩阵的列…

ASO优化之如何测试应用的屏幕截图

截取屏幕截图并上传到应用商店后&#xff0c;我们需要对其进行测试和优化&#xff0c;从而来获得更高的转化率&#xff0c;精美的图片有助于提高应用在商店的安装率。 1、定义目标受众。 战略性地决定测试哪些目标受众&#xff0c;可以通过年龄、性别、地点、兴趣等来定义我们…

[黑马程序员SpringBoot2]——原理篇1

目录&#xff1a; bean的加载方式(—)bean的加载方式(二)bean的加载方式(三)FactoryBeanproxyBeanMethod属性bean的加载方式(四)bean的加载方式(五)bean的加载方式(六)bean的加载方式(七)bean的加载方式(八)bean加载控制&#xff08;编程式)bean加载控制&#xff08;注解式)be…

前端uni微信小程序和后端nodejs使用websoket

需求 前端向后台服务器发请求获取验证码&#xff0c;然后端游输入验证码&#xff0c;向我的后端发请求获取验证信息。后台给游戏端返回信息的时候同时给微信小程序端返回验证结果。意思是不要微信小程序端主动触发&#xff0c;验证是否绑定的请求。 思路 后端生成验证码时存…

python-opencv 人脸检测

python-opencv 人脸检测 代码还使用到了dlib 和face_recognition这两个库&#xff0c;需要安装一下&#xff0c;看一下代码&#xff1a; import face_recognition import cv2# 创建视频捕捉对象 video_capture cv2.VideoCapture(0) print(video_capture.isOpened())# video_…

[ZJCTF 2019]NiZhuanSiWei

虽然有include函数但我们无法直接包含flag因为对file进行了过滤&#xff0c;又看见有反序列化的入口&#xff0c;只是并没有发现可利用的方法&#xff0c;但题目有提示所以尝试将其调出来 php伪协议写入内容 看到file_get_contents函数想到使用data协议&#xff0c;去封装一个…

Hive内置表生成函数

Hive内置UDTF 1、UDF、UDAF、UDTF简介2、Hive内置UDTF 1、UDF、UDAF、UDTF简介 在Hive中&#xff0c;所有的运算符和用户定义函数&#xff0c;包括用户定义的和内置的&#xff0c;统称为UDF&#xff08;User-Defined Functions&#xff09;。如下图所示&#xff1a; UDF官方文档…

远程安全访问JumpServer:使用cpolar内网穿透搭建固定公网地址

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…

Python潮流周刊:Twitter 的强敌 Threads 是用 Python 开发的!

&#x1f984;文章&教程 1、聊一聊 Python 和 Golang 的垃圾回收 常见的垃圾回收算法有哪些&#xff0c;它们的优缺点是什么&#xff1f;Python 的垃圾回收机制由什么组成&#xff0c;如何解决内存泄漏问题&#xff1f;Golang 的垃圾回收机制又是怎样的&#xff0c;如何解…

CNN中输入通道数、卷积核的深度、卷积核的个数和输出通道数之间的关系

当涉及卷积神经网络&#xff08;CNN&#xff09;中卷积核的数量和通道数时&#xff0c;通常存在一些混淆。让我为您解释清楚&#xff1a; 通道数&#xff08;Channel&#xff09;&#xff1a;在CNN中&#xff0c;输入数据通常是一个三维张量&#xff0c;具有宽度、高度和通道数…

新式的拉式膜片弹簧离合器设计机械设计CAD

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;离合器 获取完整论文报告工程源文件 减震弹簧 摩擦片 膜片弹簧 压盘 轴 扭转减震器 从动盘 离合器 离合器的结构设计 为了达到计划书所给的数据要求&#xff0c;设计时应根据车型的类别、使用要求、制造条件&#xff0c;…

C#,《小白学程序》第四课:数学计算,总和与平均值

程序是 数据 计算 显示。 1 文本格式 /// <summary> /// 《小白学程序》第四课&#xff1a;数学计算 /// 这节课超级简单&#xff0c;就是计算成绩的平均值&#xff08;平均分&#xff09; /// 这个是老师们经常做的一件事。 /// </summary> /// <param name&…

洛谷P1049装箱问题 ————递归+剪枝+回溯

没没没没没没没没没错&#xff0c;又是一道简单的递归&#xff0c;只不过加了剪枝&#xff0c;我已经不想再多说&#xff0c;这道题写了一开始写了普通深搜&#xff0c;然后tle了一个点&#xff0c;后面改成剪枝&#xff0c;就ac了&#xff0c;虽然数据很水&#xff0c;但是不妨…

ruoyi-plus-vue docker 部署

本文以 ruoyi-vue-plus 5.x docker 部署为基础 安装虚拟机 部署文档 安装docker 安装docker 安装docker-compose 配置idea环境 上传 /doicker 文件夹 到服务器&#xff1b;赋值 777权限 chmod -R 777 /docker idea构建 jar 包 利用 idea 构建镜像; 创建基础服务 docker…

力扣 3. 无重复字符的最长子串

题目 题解 方法 public static int lengthOfLongestSubstring(String s) {HashSet<Character> charSet new HashSet<Character>();int i 0,l0,max0;for (int j 0; j < s.length(); j) {while (charSet.contains(s.charAt(j))) {charSet.remove(s.charAt(l…

【JavaEE初阶】Thread 类及常见方法、线程的状态

目录 1、Thread 类及常见方法 1.1 Thread 的常见构造方法 1.2 Thread 的几个常见属性 1.3 启动⼀个线程 - start() 1.4 中断⼀个线程 1.5 等待⼀个线程 - join() 1.6 获取当前线程引用 1.7 休眠当前线程 2、线程的状态 2.1 观察线程的所有状态 2.2 线程状态和状…

硬盘上不小心删除了重要文档?试试这6个成功率高的数据恢复工具!

您是否不小心重新格式化了存储卡或删除了想要保留的照片&#xff1f;最好的照片恢复软件可以提供帮助&#xff01;如果您使用数码相机拍摄的时间足够长&#xff0c;那么当您错误地删除了想要保留的图像、重新格式化了错误的 SD 卡&#xff0c;或者发现您的珍贵照片由于某种莫名…

CFO的GenAI应用指南

CFO应该采取的最重要行动是识别最大的创造价值的机会&#xff0c;然后确保他们获得所需的资金和其他资源。GenAI拥有成为革命性技术的潜力&#xff0c;但它不会改变金融和经济学的基本原则&#xff1a;一家公司必须产生高于资本成本的回报。 技术改变了每一项业务&#xff0c;往…

聊聊Go语言的注释

文章目录 聊聊Go语言的注释一、注释的格式1.1 块注释1.2 行注释 二、包注释三、命令注释四、类型注释4.1 实例注释4.2 并发安全注释4.3 零值注释4.4 导出字段注释 五、函数注释5.1 参数/返回值/函数作用注释5.2 bool返回值函数注释5.3 形参/返回值名称注释5.4 并发安全注释5.5 …