从认识元注解到使用元注解
前言:注解是Java语言中的一种特殊语法,它可以为代码提供更加灵活的元数据信息,方便代码的处理和使用。而元注解则是用于定义注解的注解,它可以为注解提供更多的元数据信息和特性。本文将介绍如何自定义元注解,包括认识、了解和实战使用。(有错误的地方欢迎指出,我们共同成长)
一、认识元注解
元注解是用于定义注解的注解,它可以为注解提供更多的元数据信息和特性。Java中提供了四种元注解:
@Target:用于指定注解可以修饰哪些程序元素,包括类、方法、字段等。
@Retention:用于指定注解的生命周期,包括源代码级别、编译时级别和运行时级别。
@Documented:用于指定注解是否包含在JavaDoc文档中。
@Inherited:用于指定注解是否可以被子类继承。
二、了解元注解
了解元注解可以帮助我们更好地理解注解的定义和使用。下面我们来介绍一下各个元注解的作用和使用方法。
1. @Target
@Target用于指定注解可以修饰哪些程序元素。它的取值包括:
- ElementType.TYPE:类、接口或枚举
- ElementType.FIELD:字段、枚举常量
- ElementType.METHOD:方法
- ElementType.PARAMETER:方法参数
- ElementType.CONSTRUCTOR:构造函数
- ElementType.LOCAL_VARIABLE:局部变量
- ElementType.ANNOTATION_TYPE:注解类型
- ElementType.PACKAGE:包
- ElementType.TYPE_PARAMETER:类型参数(Java 8新增)
- ElementType.TYPE_USE:类型使用(Java 8新增)
使用示例:
@Target(ElementType.METHOD)
public @interface MyAnnotation {
//...
}
2. @Retention
@Retention用于指定注解的生命周期。它的取值包括:
- RetentionPolicy.SOURCE:注解仅存在于源代码中,编译时会被忽略。
- RetentionPolicy.CLASS:注解存在于源代码和字节码中,运行时会被忽略。
- RetentionPolicy.RUNTIME:注解存在于源代码、字节码和运行时中,可以通过反射获取注解信息。
使用示例:
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
//...
}
3. @Documented
@Documented用于指定注解是否包含在JavaDoc文档中。如果设置为true,则注解会出现在JavaDoc文档中;否则不会。
使用示例:
@Documented
public @interface MyAnnotation {
//...
}
4. @Inherited
@Inherited用于指定注解是否可以被子类继承。如果设置为true,则注解可以被子类继承;否则不会。
使用示例:
@Inherited
public @interface MyAnnotation {
//...
}
三、实战使用元注解
自定义元注解可以为我们提供更多的元数据信息和特性,方便我们处理和使用注解。下面我们来看一下如何实战使用元注解。
1. 自定义元注解
我们可以通过@Target、@Retention、@Documented和@Inherited来定义自己的元注解。例如:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MyAnnotation {
String value();
}
2. 使用元注解
定义好元注解之后,我们就可以使用它来修饰其他的注解或者程序元素。例如:
@MyAnnotation("test")
public void testMethod() {
//...
}
在上面的示例中,我们使用了自定义的元注解@MyAnnotation来修饰方法testMethod,并指定了一个value属性的值为"test"。
3. 解析元注解
我们可以通过反射来获取和解析元注解信息。例如:
Method method = MyClass.class.getMethod("testMethod");
MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
String value = myAnnotation.value();
在上面的示例中,我们通过反射获取了MyClass类中名为testMethod的方法,并通过getAnnotation方法获取了它上面的@MyAnnotation注解。然后,我们可以通过注解对象的属性来获取注解信息。
4.示例二 容易理解
例如,我们可以定义一个名为@LogLevel的元注解,用于注解需要加入日志级别的注解。具体代码如下:
@Target(ElementType.ANNOTATION_TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogLevel {String value();
}
在上述代码中,我们使用@Target和@Retention标记这个注解,表示该注解可以被用在其他注解上并且在运行时生效。注解的名字是@LogLevel,我们定义了一个value属性,用于指定该注解加入日志的级别。
实战使用元注解
定义了自定义元注解之后,我们就可以在需要加入日志的注解上使用@LogLevel注解了。例如,我们定义了一个名为@MyAnnotation的注解,@MyAnnotation注解中需要记录该注解的作者和版本信息,并且需要加入INFO级别的日志。具体代码如下:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@LogLevel("INFO")
public @interface MyAnnotation {String author() default "unknown";int version() default 1;
}
在上述代码中,我们使用了@LogLevel annotation来指定加入日志的级别,@Retention注解和@Target注解用于指定该注解可以运行时和修饰在方法上。另外,我们为@MyAnnotation注解指定了两个属性,author和version。
我们在需要使用@MyAnnotation注解的方法上进行如下操作:
@MyAnnotation(author = "John Doe", version = 2)
public void myMethod() {// method body
}
在上述代码中,我们使用了@MyAnnotation注解,在方法上记录了作者和版本信息,并加入了INFO级别的日志。
获取元注解值,我们可以通过类的反射获取 可看上面第三步 ‘ 解析元注解’
四、总结
自定义元注解可以为我们提供更加灵活和丰富的注解特性,方便我们处理和使用注解。在使用元注解时,我们需要认识和了解元注解的作用和使用方法,同时需要实战来加深理解。希望本文能够帮助大家更好地理解和使用自定义元注解。
相关文章:
从认识元注解到使用元注解
前言:注解是Java语言中的一种特殊语法,它可以为代码提供更加灵活的元数据信息,方便代码的处理和使用。而元注解则是用于定义注解的注解,它可以为注解提供更多的元数据信息和特性。本文将介绍如何自定义元注解,包括认识…...

【C++从0到王者】第六站:类和对象(下)
文章目录 一、再谈构造函数1.构造函数体赋值2.初始化列表1>初始化列表的使用2>初始化列表的注意事项 3.explicit关键词 二、static成员1.如何统计当前程序中变量的个数2.static的特性3.从1加到n4.设计一个类,只能在栈或者堆上开辟空间 三、友元1.友元函数2.友…...

AJax和Axios的讲解
目录 Ajax Ajax基本介绍 同步异步 原生Ajax 原生的Ajax使用方式 Axios 基本介绍 Axios的基本使用 发送 get 请求 发送 post 请求 Axios快速入门 请求方法的别名 练习 Ajax Ajax基本介绍 Ajax: 全称Asynchronous JavaScript And XML,异步的JavaScript和XML…...

企业落地数字化转型,如何部署战略规划
当前环境下,各领域企业通过数字化相关的一切技术,以数据为基础、以用户为核心,创建一种新的,或对现有商业模式进行重塑就是数字化转型。这种数字化转型给企业带来的效果就像是一次重构,会对企业的业务流程、思维文化、…...

新的网络钓鱼即服务平台让网络犯罪分子生成令人信服的网络钓鱼页面
至少从2022年中期开始,网络犯罪分子就利用一个名为“伟大”的新型网络钓鱼即服务(PhaaS或PaaS)平台来攻击微软365云服务的企业用户,有效地降低了网络钓鱼攻击的门槛。 思科Talos研究员蒂亚戈佩雷拉表示:“目前,Greatness只专注于微软365钓鱼…...

MySQL的隐式转换
隐式转换 若字符串是以数字开头,并且全部都是数字,则转换的数字结果是整个字符串;部分是数字,则转换的数字结果是截止到第一个不是数字的字符为止 若字符串不是以数字开头,则转换的数字结果是 0 varchar str "…...

LeetCode:23. 合并 K 个升序链表
23. 合并 K 个升序链表 1)题目2)过程3)代码1. 最开始2.初步优化 4)结果1. 最开始2. 初步优化 1)题目 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合…...

js:正则表达式常用方法总结test、exec、match、matchAll、replace、replaceAll、search
文章目录 正则使用testmatch/matchAll不加g加ggroup 的使用 matchAll不加g加g exec不加g加g searchreplace 正则使用 常用的几种方法有:test、exec、match、matchAll、replace、replaceAll、search test // 匹配返回true,不匹配false /e/.test("…...

分析车载蓝牙通话只有前喇叭声音,后面喇叭无声背后原因
车载蓝牙通话只有前喇叭声音,后面喇叭无声背后原因 大家有没有注意到车载蓝牙连接后通话的时候只有前喇叭的有声音,后面喇叭没声音呢?特别是后装的车载多媒体上基本都是这样,细思下为什么这样的原因, 采访后装车载技术…...

高性能ADC/DAC FMC子卡推出-FMC164
FMC164 子卡集成 4 通道 1Gsps 采样率,16 位 高性能ADC采样,板载4 通道1.25Gsps 16 位DA。板载时钟芯片 HMC7044,可以提供 JESD204B所需要的各种时钟。具有同步/触发功能,模拟信号采用 SSMC 射频连接器输入和输出。板载时钟芯片为…...

Agisoft Metashape 红外影像处理
系列文章目录 文章目录 系列文章目录前言一、加载红外影像二、对齐照片三、构建 DEM四、生成 DOM五、温度值可视化前言 Agisoft Metashape 专业版支持处理来自 AscTec(ARA 格式)、WIRIS(TIFF 格式)热成像仪和以 R-JPEG(FLIR 数据)格式保存数据的热成像数据。 在本文中,…...

Mybatis从入门到入土
一、什么是Mybatis 1)MyBatis 是一款优秀的持久层(DAO层)框架 2)MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程 3)MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将…...
修为 - 人生感悟
人不为己,天诛地灭。 说明一下,上面说的为己,指的是人的修为。 一个人,在成年之后,需要不断的对自己进行修为的提高。在经历了世事之后,对人生的感悟要不断地进行总结,提高自己的修为。 老祖宗给…...

UnityWebSocket | 双端通信支持Text/Binary
跳转官方仓库地址 有多个项目使用该库,平台有PC、WebGL。 一、说明 1)原理 WebSocket是H5提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。数据通常在两个站(点对点)之间进行传输,按照…...
lazada详情
{“api”: “”, “data”: {“module”: “{“seller”:{“chatResponsiveRate”:{“labelText”:“Chat Response”,“value”:“100%”},“chatUrl”:“https://pages.lazada.com.my/wow/i/my/im/chat?brandId30768”,“hideAllMetrics”:false,“imEnable”:true,“imUser…...

企业为什么要数字化转型?
数字化转型是使用数字技术从根本上改变企业运营方式并为客户创造价值的过程。企业进行数字化转型,常见因素包括: 提高效率:数字化转型可以简化流程并自动执行重复性任务,从而减少执行这些任务所需的时间和精力。可以节省成本并提高…...

Excel 设置只能输入指定的字符
目录 1. 创建你要用的表格 2. 确定你要限定输入的行/ 列 3. 创建另一个sheet,用来保存限制输入的配置信息 4. 选中【是否外包】列,并选择数据验证 5. 设置数据限制 6. 确认结果 7. 不想设置配置sheet怎么办? 在工作中,你们…...

Web开发介绍
Web开发介绍 1 什么是web开发 Web:全球广域网,也称为万维网(www World Wide Web),能够通过浏览器访问的网站。 所以Web开发说白了,就是开发网站的,例如下图所示的网站:淘宝,京东等等 那么我们…...

多语言APP的外包开发流程及注意事项
近些年国内越来越多的公司走向海外,有些互联网项目即可以为国内用户使用,也可以为国外用户使用,尤其是一些智力类小游戏,这些小游戏不需要特别的运营,只要在设计和玩法上把握好,那就可以推广到全球用户。今…...

CMAKE介绍和使用(Windows平台)
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。 Windows平台 cmake工具的下载 cmake工具下载官网: Download | CMake 下载压缩包后解压,解压后的bin文件路径加到电脑系统环境…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...