java 元数据 和 元注解
基本介绍
三种基本注解
@Override
@Deprecated
@SuppressWarnings
四种元注解
@Retention
@Target
@Documented
@@Inherited
一、基本介绍
1.概述
java注解(Annotation)[ˌ ænəˈ teɪʃn],又称java标注,也被称为元数据(关于数据的数据,描述数据的数据)(Metadata)[ˈ metədeɪtə],可用于修饰或者解释包、类、方法、属性、构造器,局部变量等数据信息。
java注解和注释一样,不会影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息。在javaSE中,注解的功能比较单一,例如标记过时的功能,忽略警告等等。但注解在javaEE中占据了更重要的角色,尤其是在使用框架时,例如用来配置应用程序的任何切面,代替javaEE旧版中所残留的冗余代码和XML配置等等。
2.使用
使用Annotation时,要在它前面增加“@”符号,并把该注解当作一个修饰符来使用。以修饰它支持的程序元素。
二、3种基本注解
0.总览 :
@Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
@Deprecated - 标记某个程序元素(类或者方法等)已过时。如果使用该方法,会报编译警告。
@SuppressWarnings - 指示编译器去忽略注解中声明的警告。
1.“@Override”:
①含义
Override就是重写的意思,如下 :

②源码
@Override最大的价值在于它的判断功能。通过Ctrl + b/B 可以查看@Override源码,如下 :
/** Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.*********************/package java.lang;import java.lang.annotation.*;/*** Indicates that a method declaration is intended to override a* method declaration in a supertype. If a method is annotated with* this annotation type compilers are required to generate an error* message unless at least one of the following conditions hold:** <ul><li>* The method does override or implement a method declared in a* supertype.* </li><li>* The method has a signature that is override-equivalent to that of* any public method declared in {@linkplain Object}.* </li></ul>** @author Peter von der Ahé* @author Joshua Bloch* @jls 8.4.8 Inheritance, Overriding, and Hiding* @jls 9.4.1 Inheritance and Overriding* @jls 9.6.4.4 @Override* @since 1.5*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
其实,@Override源码中,最重要的无非最后两行。“@interface”表示Override是一个注解类,而不是接口。
“@Override”只能修饰方法,不能修饰其他程序元素(比如类,包,属性等)。这一点,其实源码中也有体现——Override源码中的“@Target(ElementType.METHOD)”明确指出了修饰的元素类型是METHOD(方法)。
PS : “@Target”是用于修饰注解的注解,我们称之为“元注解”。
2.“@Deprecated”:
①含义
Deprecated就是不赞成的意思,如下 :

②源码
“@Deprecated”可以标记过时的程序元素。仍然通过Ctrl + b/B 快捷键追溯一下Deprecated的源码,如下 : (这次仅截取关键部分)
package java.lang;import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE})
public @interface Deprecated {String since() default "";boolean forRemoval() default false;
}
同样,“@interface”表示Deprecated是一个注解类。而“@Target”元注解中,也标注出了@Deprecated可以修饰的数据元素,从左往右依次为 : {构造器,属性,局部变量,方法,包,模块,参数,类型(即类)}。
③使用
“@Deprecated”修饰的程序元素并非无法使用,只是不建议使用。来举个栗子。
演示 :
package advanced.Annotation;/*** @author : Cyan_RA9* @version : 5.0*/
public class Deprecated_ {@Deprecatedpublic void f() {System.out.println("这方法没啥屁用,不建议使用。你非要用当我没说。。。");}
}class Test {public static void main(String[] args) {Deprecated_ deprecated_ = new Deprecated_();deprecated_.f();}
}
运行结果 :

其实,当你在调用@Deprecated注解修饰的方法时,IDEA就会给出提示,如下图所示 :

可以明显看到被“@Deprecated”注解修饰的f() 方法是被删除线“ ”标注的。
④补充
啥时候用“@Deprecated”比较多?
比如,当JDK进行版本更迭的时候,新版本的JDK对旧版本的某些类或者某些方法进行了更新,可能会定义新的类型,这时候就会在旧版本的对应类型或者对应方法前打上@Deprecated标注,提醒java人们这是旧的啦,建议你用新的捏。
3.“@SuppressWarnings” :
①含义
SuppressWarnings就是抑制警告,禁止警告的意思,如下 : (Warnings小学词汇)

②格式
“@SuppressWarnings”的使用与前面两个注解略有出入。使用格式如下 :
@SuppressWarnings("explanation1", "explanation2", "explanation3", ......)
//双引号中的说明信息不同,达到的抑制警告效果便不同。
③属性说明汇总
“@SuppressWarnings”中常见的属性说明有 :
"all" | 抑制所有警告 |
"boxing" | 抑制与“封装/拆装”相关的警告 |
"cast" | 抑制与"强转类型"相关的警告 |
"dep-ann" | 抑制与"淘汰注释"相关的警告 |
"deprecation" | 抑制与"淘汰"相关的警告 |
"fallthrough" | 抑制与"switch陈述式中遗漏break"相关的警告 |
"finally" | 抑制与"未传回finally区块"相关的警告 |
"hiding" | 抑制与"隐藏变数的区域变数"相关的警告 |
"incomplete-switch" | 抑制与"switch陈述式(enum case)中遗漏项目"相关的警告 |
"javadoc" | 抑制与"javadoc"相关的警告 |
"nls" | 抑制与"非nls字串文字"相关的警告 |
"resource" | 抑制与"使用Closeable类型的资源"相关的警告 |
"null" | 抑制与"空值分析"相关的警告 |
"rawtypes" | 抑制与"使用raw类型"相关的警告(泛型) |
"restriction" | 抑制与"使用不建议或禁止参照"相关的警告 |
"serial" | 抑制与"可序列化的类别遗漏serialVersionUID栏位"相关的警告 |
"static-access" | 抑制与"静态存取不正确"相关的警告 |
"static-method" | 抑制与"可能宣告为static的方法"相关的警告 |
"super" | 抑制与"置换方法相关但不含super呼叫"的警告 |
"synthetic-access" | 抑制与"内部类别的存取未最佳化"相关的警告 |
"sync-override" | 抑制"因置换同步方法而遗漏同步化"的警告 |
"unchecked" | 抑制与"未检查的作业"相关的警告 |
"unqualified-field-access" | 抑制与"栏位存取不合格"相关的警告 |
"unused" | 抑制与"未用的程式码和停用的程式码"相关的警告(变量未使用) |
部分属性演示 :
package advanced.Annotation;import java.util.ArrayList;
import java.util.List;/*** @author : Cyan_RA9* @version : 5.0*/@SuppressWarnings({})
public class SuppressWarnings_ {public static void main(String[] args) {List list = new ArrayList();list.add("");list.add(1);list.add(1);int i;System.out.println(list.get(2));}
}
警告信息如下图所示 :

这时候可以通过在注解“@SuppressWarnings”中分别添加"rawtypes", "unchecked", "unused"属性说明来去除警告信息。如下图所示 :

添加属性说明后,⚠全部消失了,如下图所示 :

⑤作用域
关于@SuppressWarnings注解的作用域 : 取决于该注解的定义位置。
eg : 当它放在main方法前时,抑制警告的范围就是main函数;当它定义在类上,作用域就是整个类;当然,也可以在固定的警告语句上面使用@SuppressWarnings注解,通过传入指定的属性说明实现精准的消除警告。
⑥源码
通过Ctrl + b/B快捷键快速追溯到SuppressWarnings注解类的源码,源码如下 : (仅截取关键部分)
package java.lang;import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, MODULE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {String[] value();
}
同样的。"@interface"元注解表明SuppressWarnings是一个注解类。而“@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, MODULE})”表明了@SuppressWarnings注解的使用范围,从左往后依次是”{类型(类),属性,方法,参数,构造器,局部变量,模块}“。
三、4种元注解
0.总览 :
在Java中,将“修饰注解的注解”称为元注解。元注解使用并不多,本身作用也没多大,了解即可。可以看懂源码就足够了。
@Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问(保存时间)。
@Documented - 标记这些注解是否包含在javadoc用户文档中。
@Target - 标记这个注解应该是哪种 Java 成员(可以作用于哪些程序元素)。
@Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)
1.“@Retention”:
①含义
Retention就是保持,保留的意思,如下图所示 :

②使用
“@Retention”只能用于修饰一个注解定义,用于指定该注解可以保留多长时间,@Retention元注解中包含一个RetentionPolicy类型的成员变量,使用@Retention元注解时,必须为该成员变量指定值。
RetentionPolicy成员变量的三种值 :
RetentionPolicy.SOURCE | 编译器使用后,直接丢弃这种策略的注解 |
RetentionPolicy.CLASS | 编译器将把注解记录在class文件中,当运行程序时,jvm不会保留注解,这是成员变量的默认值 |
RetentionPolicy.RUNTIME | 编译器将把注解记录在class文件中,当运行程序时,jvm会保留注解,程序可以通过反射获取该注解。 |
③示意图
三种成员变量值的效果如下 :

演示 :
以Override的源码为例,如下:(仅截取关键部分)
package java.lang;import java.lang.annotation.*;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
注意看,“@Retention(RetentionPolicy.SOURCE)”中,RetentionPolicy类枚举常量是SOURCE,这就表示“@Override”注解生效的范围仅仅在.java的源文件中,不会在.class文件中生效,也不会在程序运行时被jvm读取。
2."@Target" :
①含义
Target就是目标的意思,如下图所示 :

②使用
”@Target“元注解可以指明当前注解可以作用于哪些程序元素。之前的三大基本注解中,均演示过”@Target“元注解。如下 :



③源码
Target元注解源码如下:(仅截取了重要部分)
package java.lang.annotation;@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {ElementType[] value();
}
可以看到Target底层是一个ElementType类型的数组。而通过Ctrl + b/B追溯源码,我们可以看到ElementType本质上是一个枚举类。如下 :
package java.lang.annotation;public enum ElementType {/** Class, interface (including annotation interface), enum, or record* declaration */TYPE,/** Field declaration (includes enum constants) */FIELD,/** Method declaration */METHOD,/** Formal parameter declaration */PARAMETER,/** Constructor declaration */CONSTRUCTOR,/** Local variable declaration */LOCAL_VARIABLE,/** Annotation interface declaration (Formerly known as an annotation type.) */ANNOTATION_TYPE,/** Package declaration */PACKAGE,/*** Type parameter declaration** @since 1.8*/TYPE_PARAMETER,/*** Use of a type** @since 1.8*/TYPE_USE,/*** Module declaration.** @since 9*/MODULE,/*** Record component** @jls 8.10.3 Record Members* @jls 9.7.4 Where Annotations May Appear** @since 16*/RECORD_COMPONENT;
}
ElementType枚举类中的这些枚举常量,其实就是我们说的”程序元素“。即注解可作用于的程序成分。
3.”@Documented“ :
①含义
Documented就是登记在案,文件化的意思,如下图所示 :

②使用
“@Documented”元注解修饰的注解类,会在javadoc文件中显式地呈现。
演示 :
先定义一个注解类Demo,并在该注解类中使用@Documented元注解修饰。如下 :
package advanced.Annotation;import java.lang.annotation.*;/*** @author : Cyan_RA9* @version : 2.0*/
@Documented
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.METHOD)
public @interface Demo {//自定义一个注解类。
}
然后在定义一个测试类Test_EX,并在测试类中定义两个方法,用自定义的注解”@Demo“去修饰方法。如下 :
package advanced.Annotation.test;import advanced.Annotation.Demo;/*** @author : Cyan_RA9* @version : 1.0*/
class Test_EX {@Demopublic void greet() {System.out.println("Hello!");}@Demopublic void eat() {System.out.println("美汁儿美汁儿~");}
}
然后通过IDEA自带的生成javadoc的功能生成该测试类的javadoc文件,如下GIF图所示 :

可以看到,greet方法和eat方法的”@Demo“都保留在了生成的javadoc文件中。
4.”@Inherited“ :
①含义
Inherited就是继承的意思,如下所示 :

②使用
如果每个类使用了注解,而这种注解恰好被”@Inherited“元注解修饰,那么该类的子类同样会自动拥有父类的注解。
System.out.println("END-----------------------------------------------");
相关文章:

java 元数据 和 元注解
基本介绍三种基本注解OverrideDeprecatedSuppressWarnings四种元注解RetentionTargetDocumentedInherited一、基本介绍1.概述java注解(Annotation)[ˌ nəˈ teɪʃn],又称java标注,也被称为元数据(关于数据的数据&…...

RFID射频卡写入手机NFC心路小记
声明: 本文仅是作者学习探索的心里路程日记,如果您看完以后,从中获得了一些知识,作者不胜荣幸。科技是一把双刃剑,利用好了,可以方便生活,利用不当也肯能扰乱公共管理秩序,造成不必要…...

【C++】STL 模拟实现之 list
文章目录一、list 的常用接口及其使用1、list 一般接口2、list 特殊接口3、list 排序的性能分析二、list 迭代器的实现1、迭代器的分类2、list 迭代器失效问题3、list 迭代器源码分析4、list 迭代器模拟实现4.1 普通迭代器4.2 const 迭代器4.3 完整版迭代器三、list 的模拟实现…...
20230228----重返学习-数组-引用数据类型的转换-基础调试用方法-对象检测-各数据转布尔值及相等运算符-条件语句-循环语句
day-017-seventeen-20230228-数组-引用数据类型的转换-基础调试用方法-对象检测-各数据转布尔值及相等运算符-条件语句-循环语句 数组 字面量表示法 [数组成员0,数组成员1,数组成员2]用中括号语法来取值 var ary [5,6,7] console.log("ary[0]--->", ary[0])数组…...
apscheduler 定时任务框架
Apscheduler 介绍 四大组件 triggers:触发器,用于设定触发任务的条件job stores:作业存储器,用于存放任务,可以存放在数据库或内存,默认内存executors:执行器,用于执行任务&#x…...

Softing OPC Tunnel——绕过DCOM配置实现OPC Classic广域网通信
一 摘要 Softing OPC Tunnel是dataFEED OPC Suite的一个组件,可避免跨设备OPC Classic通信中出现的DCOM配置问题,同时可保证跨网络数据交换的高性能和可靠性。OPC Tunnel内部集成的存储转发功能,可在连接中断时缓存数据,并在重新…...

Java的运算操作
个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【JavaSE_primary】 文章目录算术运算符增量运算符注意自增自减运算符关系运算符逻辑运算符逻辑与&&逻辑或||逻辑非!…...

基于OBD系统的量产车评估测试(PVE)
在轻型汽车污染物排放限值及测量方法(中国第六阶段)中,除了对汽车尾气排放等制定了更为严格的限制之外,也在OBD系统认证项目中增加了新的要求——量产车评估(Production Vehicle Evaluation)测试。该测试由…...

【蓝桥杯集训10】Tire树 字典树 最大异或对专题(3 / 3)
目录 字典树模板 1、插入操作 2、查询操作 143. 最大异或对 - trie 二进制 3485. 最大异或和 - 前缀和Trie滑动窗口 字典树模板 活动 - AcWing 字典树:高效存储和查找字符串集合的数据结构 son[节点1地址][值]节点2地址 —— 节点1的子节点为节点2cnt[节点地…...

docker部署zabbix6.2.7+grafana
目录 1、下载docker 2、下载相关镜像文件 3、创建一个供zabbix系统使用的网络环境 4、创建一个供mysql数据库存放文件的目录 5、启动mysql容器 6、为zabbix-server创建一个持久卷 7、启动zabbix-server容器 8、创建语言存放目录 9、启动zabbix-web容器 10、启动zabbix…...

【Java开发】JUC基础 04:Synchronized、死锁、Lock锁
1 概念介绍并发:同一个对象被多个线程同时操作📌 线程同步现实生活中,我们会遇到“同一个资源,多个人都想使用”的问题,比如,食堂排队打饭,每个人都想吃饭,最天然的解决办法就是,排队…...

离散数学---期末复习知识点
一、 数理逻辑 [复习知识点] 1、命题与联结词(否定¬、析取∨、合取∧、蕴涵→、等价↔),命题(非真既假的陈述句),复合命题(由简单命题通过联结词联结而成的命题) 2、命题公式与赋值(成真、成假)&#x…...

在线安装ESP32和ESP8266 Arduino开发环境
esp32和esp8266都是乐鑫科技开发的单片机产品,esp8266价格便宜开发板只需要十多块钱就可以买到,而esp32是esp8266的升级版本,比esp8266的功能和性能更强大,开发板价格大约二十多元就可以买到。 使用Arduino开发esp32和esp8266需要…...

【Python实战】激情澎湃,2023极品劲爆舞曲震撼全场,爬虫一键采集DJ大串烧,一曲醉人女声DJ舞曲,人人都听醉~(排行榜采集,妙啊~)
导语 哈喽!大家好。我是木木子吖~今天给大家带来爬虫的内容哈。 所有文章完整的素材源码都在👇👇 粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。 今天教大家Python爬虫实战一键采集大家喜欢的DJ舞曲哦! …...

[SSD综述 1.5] SSD固态硬盘参数图文解析_选购固态硬盘就像买衣服?
版权声明:付费作品,未经许可,不可转载前言SSD (Solid State Drive),即固态硬盘,通常是一种以半导体闪存(NAND Flash)作为介质的存储设备。SSD 以半导体作为介质存储数据&…...

SAP Insurance Analyzer
SAP Insurance Analyzer 是一款用于保险公司财务和风险管理的软件。SAP Insurance analyzer 支持基于 IFRS 17 或 Solvency II 的保险合同估值和计算要求。SAP Insurance Analyzer 于 2013 年 5 月推出,为源数据和结果数据集成了一个预配置的保险数据模型。 源数据…...

自动化测试 ——自动卸载软件
在平常的测试工作中,经常要安装软件,卸载软件, 即繁琐又累。 安装和卸载完全可以做成自动化。 安装软件我们可以通过自动化框架,自动点击Next,来自动安装。 卸载软件我们可以通过msiexec命令行工具自动化卸载软件 用msiexec 命令来卸载软件 …...

05 封装
在对 context 的封装中,我们只是将 request、response 结构直接放入 context 结构体中,对应的方法并没有很好的封装。 函数封装并不是一件很简单、很随意的事情。相反,如何封装出易用、可读性高的函数是非常需要精心考量的,框架中…...
clean
clean code 记得以前写过这题,写的乱七八糟,分析来分析去。 后悔应该早点写代码,leetcode大一就该刷了。 https://leetcode.cn/problems/plus-one/submissions/ class Solution { public:vector<int> plusOne(vector<int>&…...

佛科院计算机软件技术基础——线性表
一、基础知识了解:结构体的理解:我们知道整型是由1位符号位和15位数值位组成,而就可以把结构体理解为我们定义的数据类型,如:typedef struct {int data[2]; //存储顺序表中的元素int len; …...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...