Java注解(Annotation)的基本知识
Java注解(Annotation)的基本知识
此文的目的只在于了解的注解的基本知识,知道注解的一些概念,使能够看懂注解的使用。
注解概述
- Java 注解(Annotation)又称 Java 标注,使 JDK5.0 引入的一种注释机制。
- Java 语言中的类、构造器、方法、成员变量、参数等都可以被注解进行标注。

注解的作用是什么呢?
- **对 Java 中类、方法、成员变量做标记,然后进行特殊处理,**至于到底作何种处理由业务需求来决定。
- 例如: JUnit框架中,标记了注解 @Test 的方法就可以被当成测试方法执行,而没有标记的就不能当成测试方法。
- 代码文档化: 注解可以用来为代码添加说明文档,例如
@Deprecated标记已弃用的方法或类。 - 编译时检查: 通过自定义的注解,在编译时进行代码检查,例如检查代码规范、约定等。
- 运行时处理: 注解可以在运行时被读取并进行处理,例如自定义的业务逻辑、AOP(面向切面编程)等。
- 框架和库的使用: 许多 Java 框架和库使用注解来配置和控制程序的行为,比如 Spring 框架中的
@Autowired、@RequestMapping等。
自定义注解
自定义注解就是自己做一个注解来使用。
public @interface 注解名称 {public 属性类型 属性名() default 默认值; //其中属性类型 Java 支持的数据类型基本上都支持
}
定义案例:
public @interface TestAnnotation {public String myName() default "xwhking";public String sex() default "man";
}
特殊属性
- value 属性,如果只有一个 value 属性的情况下,使用 value 属性的时候可以省略 value 名称不写!!
- 但是如果有多个属性,且多个属性没有默认值,那么 value 名称是不能省略的。
理解一下,这里的 value 指的是在使用注解时的区别,如果注解里面只有一个属性,那么就不需要特别说明,给注解里面注入值,那么就自动注入到该属性了,如果有多个属性,就需要表明是哪一个属性的值。看下面的例子

因为定义了 TestAnnotation 注解,如果 TestAnnotation 里面只有一个属性,如果只有 myName 的话,那么就不需要写 myName="XXX" 了,直接输入字符串即可,而这里因为有两个属性需要写一下属性名,并且进行对应 value。
元注解
元注解:就是给注解的注解,让我们方便定义注解的注解
元注解有两个:
- @Target:约束自定义注解只能在那些地方使用
- @Retention:申明注解的生命周期
@Target
@Target 中可使用的值定义在Element枚举类中,常用值如下
- TYPE,类、接口
- FIELD,成员变量
- METHOD,成员方法
- PARAMETER,方法参数
- CONSTRUCTOR,构造器
- LOCAL_VARIABLE,局部变量
@Retention
@Retention 中可使用的值定义在 RetentionPolicy 枚举类中,常用值如下:
- SOURCE : 注解之作用在源码阶段,生成的字节码文件中不存在
- CLASS: 注解作用在源码阶段,字节码文件阶段,运行阶段不存在,默认值
- RUNTIME:注解作用在源码、字节码、运行阶段
注解解析
注解的解析
注解的操作中经常需要进行解析,注解的解析就是判断是否存在注解,存在注解就解析出内容。
与注解解析相关的接口
-
Annotation: 注解的顶级接口,注解都是Annotation类型的对象
-
AnnotatedElement:该接口定义了与注解解析相关的解析方法
| 方法 | 说明 |
|---|---|
| Annotation[] getDeclaredAnnotations() | 获得当前对象上使用的所有注解,返回注解数组。 |
| T getDeclaredAnnotation(Class annotationClass) | 根据注解类型获得对应注解对象 |
| boolean isAnnotationPresent(Class annotationClass) | 判断当前对象是否使用了指定的注解,如果使用了则返回true,否则false |
<T extends Annotation> T getAnnotation(Class<T> annotationClass) | 根据注解类型获得对应注解对象(包括继承关系中的注解) |
- 所有的类成分Class, Method , Field , Constructor,都实现了AnnotatedElement接口他们都拥有解析注解的能力
getAnnotation(Class<? extends Annotation> annotationClass)方法与getDeclaredAnnotation(Class<T> annotationClass)方法功能相似,但是getAnnotation方法会检查继承链中的注解。如果指定类型的注解存在于继承层次结构中,它会返回该注解;否则,返回 null。
解析注解的技巧
注解在哪个成分上,我们就先拿哪个成分对象。
- 比如注解作用成员方法,则要获得该成员方法对应的Method对象,再来拿上面的注解
- 比如注解作用在类上,则要该类的Class对象,再来拿上面的注解
- 比如注解作用在成员变量上,则要获得该成员变量对应的Field对象,再来拿上面的注解
注解使用实例
上了上面那么多,知道了基本知识,现在我们来做一个实例,加深我们对注解的理解。
- 定义一个注解用于检测用户权限
/*** 定义权限控制注解*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PermissionRequired {String checkRole() default "user";
}
- 制造一个使用场景
public class UserController {@PermissionRequiredpublic String getUserData(){return "{" +"username:xwhking" +"password:admin123" +"}";}
}
- 利用注解对权限校验
public class CheckAuth {public static boolean check(Method method,String userRole){Annotation annotation = method.getAnnotation(PermissionRequired.class);if(annotation != null){String requiredRole = ((PermissionRequired) annotation).checkRole();if(userRole.equals(requiredRole)){return true;}}return false;}public static void main(String[] args) throws NoSuchMethodException {if(check(UserController.class.getMethod("getUserData"),"admin")){System.out.println("校验通过");}else{System.out.println("校验不通过!");}}
}
通过运行 CheckAuth 的主程序按照上面的代码运行的话结果是:

因为上面那个方法用了注解,没有给具体的值所以默认值是 "user" 与给的 "admin"不一致所以不通过。
如果把上面用到注解的地方改为 @PermissionRequired("admin") 再次运行代码就可以通过了。
相关文章:
Java注解(Annotation)的基本知识
Java注解(Annotation)的基本知识 此文的目的只在于了解的注解的基本知识,知道注解的一些概念,使能够看懂注解的使用。 注解概述 Java 注解(Annotation)又称 Java 标注,使 JDK5.0 引入的一种注释机制。Java 语言中的…...
ssh远程连接不了虚拟机ubuntu
直奔主题 1. 确保linux安装了ssh2.查看网络适配器是否启用3.连接成功 1. 确保linux安装了ssh sudo apt-get install openssh-server2.查看网络适配器是否启用 3.连接成功...
文心一言 VS 讯飞星火 VS chatgpt (140)-- 算法导论11.4 5题
五、用go语言,考虑一个装载因子为a的开放寻址散列表。找出一个非零的a值,使得一次不成功查找的探查期望数是一次成功查找的探查期望数的 2 倍。这两个探查期望数可以使用定理11.6 和定理 11.8 中给定的上界。 文心一言,代码正常运行…...
代码随想录Day51 完结篇 LeetCode T84 柱状图的最大矩形
前言 今天代码随想录一刷也告一段落了,没想到我居然坚持下来了,一节都没有落下,学习到了很多种不同的解题思路,也和大家一块交流了很多,哈哈也许不久以后我还得再次二刷代码随想录,希望这一系列的题解能给大家带来帮助,如想要系统学习,请参照代码随想录网站的题解以及b站的配套…...
对接苹果支付退款退单接口
前言 一般而言,我们其实很少对接退款接口,因为退款基本都是商家自己决定后进行操作的,但是苹果比较特殊,用户可以直接向苹果发起退款请求,苹果觉得合理会退给用户,但是目前公司业务还是需要对接这个接口&am…...
合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(三)
基于ARM语音识别的智能家居系统 我们上一篇,我们实现在Linux系统下编译程序,我们首先通过两个小练习来熟悉一下如何去编译。今天,我们来介绍一下LCD屏幕基本使用。 一、LCD屏幕基本使用 如何使用LCD屏幕? 1、打开开发板LCD设…...
Web前端—移动Web第四天(vw适配方案、vw和vh的基本使用、综合案例-酷我音乐)
版本说明 当前版本号[20231122]。 版本修改说明20231122初版 目录 文章目录 版本说明目录移动 Web 第四天01-vw适配方案vw和vh基本使用vw布局vh布局混用问题 02-综合案例-酷我音乐准备工作头部布局头部内容搜索区域banner 区域标题公共样式排行榜内容推荐歌单布局推荐歌单内…...
报错注入 [极客大挑战 2019]HardSQL1
打开题目 输入1或者1",页面均回显NO,Wrong username password!!! 那我们输入1 试试万能密码 1 or 11 # 输入1 and 12 # 输入1 union select 1,2,3 # 输入1 ununionion seselectlect 1,2,3 # 输入1 # 输入1# 页面依旧回…...
【MATLAB源码-第83期】基于matlab的MIMO中V-BALST结构ZF和MMSE检测算法性能误码率对比。
操作环境: MATLAB 2022a 1、算法描述 在多输入多输出(MIMO)通信系统中,V-BLAST(垂直波束形成层间空间时间编码技术)是一种流行的技术,用于提高无线通信的数据传输速率和容量。它通过在不同的…...
Android13 新增 Stable AIDL接口
问题描述: 我需要在netd aidl 中添加新的接口: 设置网卡MAC地址: void setHardwareAddress(in utf8InCpp String iface, in utf8InCpp String hwAddr); 背景: Android 10 添加了对稳定的 Android 接口定义语言 (AIDL) 的支持&…...
Postman API Enterprise 10.18.1 Crack
适合您企业的 Postman API 平台 掌控您的 API 环境。构建更好的 API。加快产品开发。 无论您处于 API 之旅的哪个阶段,Postman 都会为您提供帮助 想让您团队的 API 更容易被发现吗?希望减少开发和质量检查之间的滞后时间?想要更快地让新开发…...
电脑内存升级
ddr代兼容 自从DDR内存时代开启之后,只要满足内存的插槽规格相同(DDR3或DDR4或DDR5即为内存规格)这一条件,不同品牌、不同频率以及不同容量的茶品都可以一起使用,除了品牌和容量的影响之外,不同频率的搭配可能会造成性能方面的影…...
ExcelBDD PHP Guideline
在PHP里面支持利用Excel的BDD,也支持利用Excel进行参数化测试 ExcelBDD Use Excel file as BDD feature file, get example data from Excel files, support automation tests. Features The main features provided by this library are: Read test data acco…...
C++静态链接库的生成以及使用
目录 一.前言二.生成静态链接库三.使用静态链接库四.其他 一.前言 这篇文章简单讨论一下VS如何生成和使用C静态链接库,示例使用VS2022环境。 二.生成静态链接库 先创建C项目-静态库 然后将默认生成的.h和.cpp文件清理干净,当然你也可以选择保留。 然…...
【2024系统架构设计】 系统架构设计师第二版-未来信息综合技术
目录 一 信息物理系统 二 人工智能 三 机器人技术 四 边缘计算 五 数字孪生体...
JavaFX修改软件图标
JavaFX默认使用jdk的程序图片显示,可以通过以下代码进行修改设置 stage.getIcons().add(new Image("static/icon.png")); static/icon.png改为自己图片路径 这里可以使用相对路径和绝对路径,看自己需求设置 例: import javafx.a…...
Linux ps -ef|grep去除 grep --color=auto信息
linux 监控 进程判断是否启动可通过该指令实现 ps -ef|grep java指令结果为 # -v 参数有过滤作用 ps -ef|grep java |grep -v grep...
jQuery的学习(一篇文章齐全)
目录 Day29 jQuery 1、jQuery介绍 2、jQuery的选择器 2.1、直接查找 2.2、导航查找 3、jQuery的绑定事件 案例1:绑定取消事件 案例2:模拟事件触发 4、jQuery的操作标签 tab切换案例jQuery版本: 案例1: 案例2ÿ…...
注塑行业各类业务流程图(系统化)
...
Android Studio 安装及使用
🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…...
第107篇:AI如何重塑知识付费?——个性化课程生成与自适应学习路径(操作教程)
文章目录 前言 环境准备:选对工具,事半功倍 分步操作:从用户画像到个性化路径 第一步:构建动态用户画像 第二步:创建模块化知识库 第三步:生成个性化课程大纲与内容 第四步:实现自适应学习路径引擎 完整代码示例:一个极简的端到端流程 踩坑提示:我趟过的雷,你避开 总…...
别再乱存图片了!深入解析TFT-LCD图片显示的内存优化与外部Flash方案
嵌入式系统中的TFT-LCD图片显示优化:从内存管理到存储方案设计 当你在STM32F103上开发一个带TFT-LCD显示的产品时,是否遇到过这样的困境:精心设计的UI界面因为图片资源太多而无法装入有限的Flash?或者动画效果因为加载速度慢而卡顿…...
RV1126驱动移植笔记:我是如何搞定JD9366触摸屏的(从源码分析到DTS调试)
RV1126驱动移植实战:JD9366触摸屏从源码解析到DTS调试全记录 第一次拿到JD9366触摸屏驱动源码时,我盯着满屏的寄存器定义和i2c传输函数发了半小时呆——这堆代码到底该怎么塞进RV1126的内核?为什么别人的移植笔记总是轻描淡写地略过最关键的调…...
Nacos 2.3.0版本升级注意:连接达梦DM数据库的Docker配置变了,你的驱动包挂载路径对了吗?
Nacos 2.3.0版本升级实战:达梦DM数据库驱动挂载路径变更详解 最近在帮客户部署基于国产化数据库的微服务架构时,遇到了一个典型问题:Nacos 2.3.0版本对驱动加载机制做了调整,导致按照旧版本教程配置的达梦DM数据库连接无法正常工作…...
AI应用Docker镜像实战:PyTorch/TensorFlow环境一键部署与优化
1. 项目概述:一个为AI应用量身定制的Docker镜像 如果你正在尝试部署一个AI相关的应用,无论是大语言模型、图像生成工具,还是某个特定的机器学习服务,大概率会碰到一个让人头疼的问题:环境依赖。Python版本冲突、CUDA驱…...
如何快速掌握EASY-HWID-SPOOFER:Windows硬件伪装工具完全指南
如何快速掌握EASY-HWID-SPOOFER:Windows硬件伪装工具完全指南 【免费下载链接】EASY-HWID-SPOOFER 基于内核模式的硬件信息欺骗工具 项目地址: https://gitcode.com/gh_mirrors/ea/EASY-HWID-SPOOFER EASY-HWID-SPOOFER是一款基于内核模式的硬件信息欺骗工具…...
三分钟原型:用快马快速构建DLL依赖诊断工具,解决“无法定位程序输入点”错误
最近在Windows下开发时遇到了经典的"无法定位程序输入点于动态链接库"错误,这个报错真是让人头疼。经过一番折腾,我发现用InsCode(快马)平台可以快速搭建一个DLL依赖诊断工具的原型,整个过程比想象中简单多了。 工具功能设计思路 这…...
如何在5分钟内为Unity游戏安装模组:MelonLoader终极入门指南
如何在5分钟内为Unity游戏安装模组:MelonLoader终极入门指南 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader 你是否…...
三步轻松搞定QQ音乐加密文件:qmcdump解码工具完整指南
三步轻松搞定QQ音乐加密文件:qmcdump解码工具完整指南 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是否…...
嵌入式Linux开发调试提速:用TFTP+NFS告别反复烧写EMMC的烦恼(基于I.MX6U平台)
嵌入式Linux开发调试提速:用TFTPNFS告别反复烧写EMMC的烦恼(基于I.MX6U平台) 在嵌入式Linux开发过程中,最令人头疼的莫过于每次修改内核或驱动后都需要重新烧录到EMMC进行测试。这种传统方式不仅耗时费力,还会显著降低…...
