Java注解

news2024/10/3 2:25:22

Java注解(Annotation)

Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
注解也叫元数据,一种代码级别的说明,说明程序的是给计算机看的,与类,接口,枚举是在同一个层次,通过@注解名称使用·
元注解:可以理解为注解上的注解,或者说元注解是一种基本注解,但是它可以应用到其他的注解上面。
元标签有 @Retention、@Documented、@Target、@Inherited、@Repeatable 5 种。
在这里插入图片描述
每1个Annotation对象,都会有唯一的RetentionPolicy属性。对于每 1 个 Annotation 对象,可以有若干个 ElementType 属性。Annotation 有许多实现类,包括:Deprecated, Documented, Inherited, Override 等等。
Annotation 的每一个实现类,都 “和 1 个 RetentionPolicy 关联” 并且 " 和 1~n 个 ElementType 关联"。
Annotation.java

package java.lang.annotation;
public interface Annotation {

    boolean equals(Object obj);

    int hashCode();

    String toString();

    Class<? extends Annotation> annotationType();
}

ElementType.java

package java.lang.annotation;

public enum ElementType {
    TYPE,               /* 类、接口(包括注释类型)或枚举声明  */

    FIELD,              /* 字段声明(包括枚举常量)  */

    METHOD,             /* 方法声明  */

    PARAMETER,          /* 参数声明  */

    CONSTRUCTOR,        /* 构造方法声明  */

    LOCAL_VARIABLE,     /* 局部变量声明  */

    ANNOTATION_TYPE,    /* 注释类型声明  */

    PACKAGE             /* 包声明  */
}

RetentionPolicy.java

package java.lang.annotation;
public enum RetentionPolicy {
    SOURCE,            /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了  */

    CLASS,             /* 编译器将Annotation存储于类对应的.class文件中。默认行为  */

    RUNTIME            /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */
}

(1) Annotation 就是个接口。

“每 1 个 Annotation” 都与 “1 个 RetentionPolicy” 关联,并且与 “1~n 个 ElementType” 关联。可以通俗的理解为:每 1 个 Annotation 对象,都会有唯一的 RetentionPolicy 属性;至于 ElementType 属性,则有 1~n 个。

(2) ElementType 是 Enum 枚举类型,它用来指定 Annotation 的类型。

“每 1 个 Annotation” 都与 “1~n 个 ElementType” 关联。当 Annotation 与某个 ElementType 关联时,就意味着:Annotation有了某种用途。例如,若一个 Annotation 对象是 METHOD 类型,则该 Annotation 只能用来修饰方法。

(3) RetentionPolicy 是 Enum 枚举类型,它用来指定 Annotation 的策略。通俗点说,就是不同 RetentionPolicy 类型的 Annotation 的作用域不同。

“每 1 个 Annotation” 都与 “1 个 RetentionPolicy” 关联。

(1)若 Annotation 的类型为 SOURCE,则意味着:Annotation 仅存在于编译器处理期间,编译器处理完之后,该 Annotation 就没用了。 例如," @Override" 标志就是一个 Annotation。当它修饰一个方法的时候,就意味着该方法覆盖父类的方法;并且在编译期间会进行语法检查!编译器处理完后,“@Override” 就没有任何作用了。
(2) 若 Annotation 的类型为 CLASS,则意味着:编译器将 Annotation 存储于类对应的 .class 文件中,它是 Annotation 的默认行为。
(3) 若 Annotation 的类型为 RUNTIME,则意味着:编译器将 Annotation 存储于 class 文件中,并且可由JVM读入。

注解和注释的区别
注解:说明程序的,给计算机看的
注释:用文字描述程序的,给程序员看的

作用分类:
编写文档:通过代码里标识的注解生成文档(生成文档doc文档)
代码分析:通过代码里标识的注解对代码进行分析(使用反射)
编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查(Override)

Java定义了一套注解,共有七个,三个在java.lang 中,@Override @Deprecated @SuppressWarnings 剩下 4 个在 java.lang.annotation中。
@Retention @Documented @Target @Inherited
在Java 7 开始,额外添加了三个注解,前两个也在java.lang中 最后一个在java.lang.annotation中:
@SafeVarargs @FunctionalInterface @Repeatable

Java.lang中的注解也叫Java预置的注解
@Deprecated
这个元素是用来标记过时的元素,编译器在编译阶段遇到这个注解时会发出提醒警告,告诉开发者正在调用一个过时的元素比如过时的方法、过时的类、过时的成员变量。

@Override
提示子类要复写父类中被 @Override 修饰的方法

@SuppressWarnings
阻止警告的意思。之前说过调用被 @Deprecated 注解的方法后,编译器会警告提醒,而有时候开发者会忽略这种警告,他们可以在调用的地方通过 @SuppressWarnings 达到目的。

@SafeVarargs
参数安全类型注解。它的目的是提醒开发者不要用参数做一些不安全的操作,它的存在会阻止编译器产生 unchecked 这样的警告。它是在 Java 1.7 的版本中加入的。

@FunctionalInterface
函数式接口注解,这个是 Java 1.8 版本引入的新特性。函数式接口 (Functional Interface) 就是一个具有一个方法的普通接口。

元注解
@Retention
当 @Retention 应用到一个注解上的时候,它解释说明了这个注解的的存活时间。@Retention 去给一张标签解释的时候,它指定了这张标签张贴的时间。@Retention 相当于给一张标签上面盖了一张时间戳,时间戳指明了标签张贴的时间周期。

RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。

@Documented
它的作用是能够将注解中的元素包含到 Javadoc 中去。

@Target
target 指定了注解运用的地方。当一个注解被 @Target 注解时,这个注解就被限定了运用的场景。

ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
ElementType.CONSTRUCTOR 可以给构造方法进行注解
ElementType.FIELD 可以给属性进行注解
ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
ElementType.METHOD 可以给方法进行注解
ElementType.PACKAGE 可以给一个包进行注解
ElementType.PARAMETER 可以给一个方法内的参数进行注解
ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举

@Inherited
继承,@Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。

@Repeatable
@Repeatable 是 Java 1.8 才加进来的,所以算是一个新的特性。可重复,就是一个可以有多个身份

注解的提取(重点)
注解通过反射获取,首先可以通过Class对象的isAnnotationPresent()方法判断他是否应用了某个注解

public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {}

然后通过 getAnnotation() 方法来获取 Annotation 对象。返回指定类型的注解

public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {}

或者是 getAnnotations() 方法。返回注解到这个元素上的所有注解

public Annotation[] getAnnotations() {}

如果获取到的 Annotation 如果不为 null,则就可以调用它们的属性方法了。比如

@TestAnnotation()
public class Test {
    public static void main(String[] args) {
        boolean hasAnnotation = Test.class.isAnnotationPresent(TestAnnotation.class);
        if ( hasAnnotation ) {
            TestAnnotation testAnnotation = Test.class.getAnnotation(TestAnnotation.class);
            System.out.println("id:"+testAnnotation.id());
            System.out.println("msg:"+testAnnotation.msg());
        }
    }
}

这个返回的是 TestAnnotation 中 id 和 msg 的默认值。

 id: -1 msg:

上面能够通过反射得到在类上的注解,其实属性,方法上的注解也是可以的.如果一个注解要在运行时被成功提取,那么@Retention(RetentionPolicy.RUNTIME) 是必须的。

注解的主要用处

提供信息给编译器: 编译器可以利用注解来探测错误和警告信息
编译阶段时的处理: 软件工具可以用来利用注解信息来生成代码、Html文档或者做其它相应处理。
运行时的处理: 某些注解可以在程序运行的时候接受代码的提取
值得注意的是,注解不是代码本身的一部分。

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

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

相关文章

事件绑定(onsubmit)表单提交

事件绑定(onsubmit)表单提交 学习路线&#xff1a;JavaScript基础语法&#xff08;输出语句&#xff09;->JavaScript基础语法&#xff08;变量&#xff09;->JavaScript基础语法&#xff08;数据类型&#xff09;->JavaScript基础语法&#xff08;运算符&#xff09…

Python笔记 · Python语言的“动态性”

尽管对于Python程序员来说已经司空见惯&#xff0c;但是当那些从非动态语言转过来的程序员初次看到形如self.xxxxxx的语句就是在定义对象属性时往往会感到“离奇”&#xff1a;一个未经声明的&#xff08;类似private int a;那样&#xff09;变量&#xff0c;直接从self中“点”…

java知识回顾笔记(对象、反射、内省、实例、父类、构造方法、封装、泛型、super())

类&对象 在创建了一个类时&#xff0c;只声明但不赋值&#xff0c;其默认值为&#xff1a; 理解下图含义&#xff0c;即可理解对象和类&#xff1a; 实例 对象又被称为实例&#xff0c;实例变量被创建时&#xff0c;系统默认会赋值&#xff0c;例如&#xff1a; Studen…

什么知识库工具适合小团队?看看文档管理系统+NAS的最新解决方案

编者按&#xff1a;还在为团队选那款网盘而发愁吗?试试文档管理系统和NAS结合吧&#xff0c;高效率低成本&#xff0c;适合小团队。 关键词&#xff1a;免维护&#xff0c;免安装&#xff0c;大容量&#xff0c;在线编辑&#xff0c;文档共享&#xff0c;数据安全 对于企业或…

LeetCode-66-加一

1、从后向前遍历 我们可以从后向前遍历数组&#xff0c;针对不同的情况进行操作&#xff1a;1、若当前数字不为9&#xff0c;则我们直接将数字的值加一并返回即可&#xff1b;2、若当前数字为9&#xff0c;我们将当前数字置为0并对前一位执行加一操作&#xff1b;3、若所有数字…

后端接口时通时不通,团队全链路排查实战

背景&#xff1a; 1 最近团队做了一套系统&#xff0c;已经临近上线了&#xff1b; 2 后端的服务和前端的代码都是新写的&#xff0c;两边的服务器&#xff0c;数据库也都是新申请的&#xff1b; 3 本来测试的时候用的测试服务器&#xff0c;一切都挺好的&#xff0c;但部署到线…

基于分发与计算的GRTN全球实时传输网络

一张能同时满足「分发」与「计算」需求的网。 从直播趋势看「分发」与「计算」 阿里云直播产品架构图中&#xff0c;主要分为端和云两个部分&#xff1a;在端侧&#xff0c;主要包含推流端和播放端&#xff1b;在云侧&#xff0c;一是基于分布式节点构建的传输网&#xff0c;二…

mosquitto部署mqtt broker 并测试订阅与发布

mosquitto部署mqtt broker 并测试订阅与发布 1&#xff0c;MQTT协议介绍 MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上&#xff0c;是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型…

如何使用phpstudy在服务器上发布Discuz_X3.4_SC_UTF8_20220811和zzcms2023

Web-ZZCMS&#xff1a; 源码下载&#xff1a;http://www.zzcms.net/about/6.html Web-Discuz&#xff1a; 源码下载&#xff1a;https://www.discuz.net/ 首先安装phpstudy&#xff0c;傻瓜式安装教程&#xff0c;如果中途 遇到报错比如我遇到的是Apache未启动&#xff0c;80端…

Ansible自动化部署安装openGauss3.1企业版单机

文章目录一、背景二、环境准备三、具体实施步骤3.1、安装ansible3.2、配置主机清单3.3、测试主机连通性3.4、创建相关目录3.5、下载openGauss软件包到files目录3.6、创建变量文件3.7、创建安装时需要的xml模板3.8、创建任务文件四、执行自动化安装4.1、校验语法4.2、自动化安装…

CAD新手必练图形三

这次说的这个CAD新手必练图形&#xff0c;用到了CAD直线、圆、多边形、修剪和旋转等多个CAD功能命令&#xff0c;一起跟着操作一下吧 目标图形 操作步骤 1.使用CAD直线命令绘制一条垂直的直线和两条水平的直线&#xff0c;两条水平的直线之间的距离为15&#xff0c;并将他们修…

【CSDN竞赛第11期】编程竞赛总结

文章目录前言/背景题目与解题代码1. 圆小艺2. K皇把妹3. 筛选宝物4. 圆桌CSDN编程竞赛报名地址&#xff1a;https://edu.csdn.net/contest/detail/16 前言/背景 目前已经连续参加10次CSDN的编程竞赛了&#xff0c;这种比赛挺有意义&#xff0c;希望一直举办下去&#xff01; 题…

JDBC 访问数据库

文章目录一、实验目的二、实验要求三、实验内容1、设计数据库表2、定义实体类3、定义数据库连接类4、实现数据库的增删改查5、测试用例一、实验目的 理解 JDBC 的工作原理&#xff0c;掌握 JDBC 访问数据库&#xff1b; 掌握常见数据库 MYSQL &#xff1b; 二、实验要求 理解…

【华为上机真题 2022】字符串序列判定

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

中断系统中的设备树__中断号的演变与irq_domain

1 中断号与硬件相关_号码固定 当我们的系统中只有一两个中断控制器时&#xff0c;上面的方法很有用&#xff0c;可以给每一个中断预先确定好他的虚拟中断号&#xff0c;但是当中断控制器越来越多、当中断越来越多&#xff0c;上述方法(virq和hwirq固定绑定)有缺陷: a. 增加工作…

马克思的手稿-第11届蓝桥杯Scratch选拔赛真题精选

[导读]&#xff1a;超平老师计划推出Scratch蓝桥杯真题解析100讲&#xff0c;这是超平老师解读Scratch蓝桥真题系列的第92讲。 蓝桥杯选拔赛每一届都要举行4~5次&#xff0c;和省赛、国赛相比&#xff0c;题目要简单不少&#xff0c;再加上篇幅有限&#xff0c;因此我精挑细选…

23软考备考已开始,网络工程师知识点速记~(2)

新一轮软考备考来啦~ 为了帮助大家提高备考效率&#xff0c;将2023上半年软考网络工程师知识点速记分享给大家&#xff0c;快来跟着一起打卡学习吧&#xff01; 指令系统 指令系统是中央处理器所有指令的集合&#xff0c;通常一条指令可分解为操作码和地址码两部分&#xff…

python 从一道作业题到制作一个图形界面的“诈金花”游戏

题目很简单&#xff1a;就是自己写一个程序&#xff0c;实现诈金花游戏的发牌、判断输赢。 规则&#xff1a; 一付扑克牌&#xff0c;去掉大小王&#xff0c;每个玩家发3张牌&#xff0c;最后比大小&#xff0c;看谁赢。 牌型&#xff1a; 豹子&#xff1a;三张一样的牌&am…

Fluent案例:肾动脉RDN治疗过程的仿真

1 问题背景 肾动脉消融&#xff08;Renal denervation&#xff0c;简称RDN&#xff09;是一种治疗高血压的办法&#xff0c;其基本原理为利用插入肾动脉的电极消融导管进行射频消融&#xff0c;使肾动脉血管壁附近的交感神经因高温而损伤失活&#xff0c;减少神经系统过度活跃的…

想转行做IC,却找不到适合自己的岗位?

想跨行从事IC行业&#xff0c;但是没有一个比较好的学历&#xff0c;也没有一个很好的专业&#xff0c;或者受限于各种各样的外在条件&#xff0c;那么在这个行业里面&#xff0c;到底有没有个岗位能够适合自己上手呢&#xff1f; 当然有&#xff0c;不是所有芯片岗位都要高学…