【JavaSE系列】注解

目录

前言 

一、概述

二、Java预置注解

三、自定义注解

四、元注解

1. @Retention

2. @Target

3. @Documented

4. @Inherited

5. @Repeatable

五、反射注解 

总结


前言 

  随着Java语言的发展,注解(Annotations)逐渐成为了Java编程不可或缺的一部分。自从JDK 1.5引入注解以来,这一功能极大地丰富了Java的元数据表达能力,使得在不改变原有代码逻辑的前提下,可以在代码中嵌入补充信息。注解不仅能够为代码添加元数据,还可以在框架实现中发挥重要作用。本文旨在详细介绍Java注解的相关概念,包括Java预置注解、自定义注解、元注解以及如何通过反射获取注解信息等内容,帮助大家更好地理解和应用注解。

一、概述

  什么是注解? 注解是JDK1.5才引入的。 注解可以标注在 类上,属性上,方法上 等。 注解可以做到在不改变代码逻辑的前提下在代码中嵌入补充信息。注解与注释是有区别的,其中注释是给程序员看的,编译器编译时会忽略注释;注解是给编译器看的,或给其它程序看的,程序根据有没有这个注解来决定不同的处理方式。注解在一些框架的实现上来说是非常重要的。

二、Java预置注解

  Java为程序员提供了一些内置的注解,下面列举了几个常见的注解:

注解描述
@Deprecated用来标记过时的元素,在编译阶段遇到这个注解时会发出提醒警告,告诉开发者正在调用一个过时的元素比如过时的类、过时的方法、过时的属性等。
@Override修饰实例方法,则该方法必须是个重写方法,否则就会编译失败。
@SuppressWarnings

抑制警告的注解,在实际开发中,建议尽量不要忽略警告,而是真正的去解决警告。

@SuppressWarnings("rawtypes"):抑制未使用泛型的警告

@SuppressWarnings("resource"):抑制未关闭资源的警告

@SuppressWarnings("deprecation"):抑制使用了已过时资源时的警告

@SuppressWarnings("all"):抑制所有警告

@FunctionalInterface“函数式接口”的注解,这个是 JDK1.8 版本引入的新特性。使用@FunctionalInterface标注的接口,则该接口就有且只能存在一个抽象方法,否则就会发生编译错误(注意:接口中的默认方法或静态方法可以有多个)。

补充:在Java中,函数式接口(Functional Interface)是指只有一个抽象方法的接口。这种接口可以使用lambda表达式或方法引用来创建实现对象。

三、自定义注解

  我们可以使用 @interface 来定义注解。 默认情况下注解可以出现在类上、方法上、属性上、构造方法上、方法参数上等...... 所有自定义的注解,它的父类是:java.lang.annotation.Annotation。注解可以定义属性,不过属性定义时,属性名后面必须加一个小括号。 属性的类型只能是byte,short,int,long,float,double,boolean,char、String、Class、枚举类型、注解类型和以上所有类型的一维数组形式。注解在使用时必须给属性赋值,除非使用了default关键字为属性指定了默认值。 如果属性只有一个,并且属性名是value时,使用注解时value可以省略不写。 如果属性是一个数组,使用注解时,数组值只有一个,数组的大括号是可以省略的。下图展示了注解编译成class文件后本质是一个接口。

四、元注解

  用来标注注解的注解叫做元注解,元注解也是JDK内置的注解。常用的元注解有:

注解描述
@Retention设置注解的保持性
@Target设置注解可以出现的位置
@Documented设置注解是否可以生成到帮助文档中
@Inherited设置注解是否支持继承
@Repeatable设置注解在某一个元素上是否可以重复使用(Java8的新特性。)

1. @Retention

  Retention英文意思有保留、保持的意思,它表示注解存在阶段是保留在源代码(编译期),字节码(类加载)或者运行时(JVM中运行)。在@Retention注解中使用枚举RetentionPolicy来表示注解保留时期。下面列举出了这三种策略:

注解形式描述
@Retention(RetentionPolicy.SOURCE)注解仅存在于源代码中,在字节码文件中不包含。
@Retention(RetentionPolicy.CLASS)注解在字节码文件中存在,但运行时无法获得(默认)。
@Retention(RetentionPolicy.RUNTIME)注解在字节码文件中存在,且运行时可通过反射获取。

2. @Target

  该注解使用ElementType枚举类型用于描述注解可以出现的位置, ElementType有如下枚举值:

注解形式描述
@Target(ElementType.TYPE)作用于接口、类、枚举、注解
@Target(ElementType.FIELD)作用于属性、枚举的常量
@Target(ElementType.METHOD)作用于方法
@Target(ElementType.PARAMETER)作用于方法参数
@Target(ElementType.CONSTRUCTOR)作用于构造方法
@Target(ElementType.LOCAL_VARIABLE)作用于局部变量
@Target(ElementType.ANNOTATION_TYPE)作用于注解
@Target(ElementType.PACKAGE)作用于包
@Target(ElementType.TYPE_PARAMETER)作用于泛型,即泛型方法、泛型类和泛型接口
@Target(ElementType.TYPE_USE)作用于任意类型

3. @Documented

  Documented的英文意思是文档。使用javadoc.exe工具可以从程序源代码中抽取类、方法、属性等注释形成一个源代码配套的API帮助文档,而该工具抽取时默认不包括注释内容。如果使用的注解被@Documented标注,那么该注解就能被javadoc.exe工具提取到API文档。

4. @Inherited

  Inherited的英文意思是继承,但是这个继承和我们平时理解的继承大同小异,一个被@Inherited注解了的注解修饰了一个父类,则它的子类也继承了父类的注解。

5. @Repeatable

  Repeatable表示可重复的含义,该注解属于JDK1.8版本的新特性。可重复的一个示例如下图所示:

五、反射注解 

  反射注解用到的方法具有相似的名称,其中getAnnotations()获取所有注解,getAnnotation(Class annotationClass)获取指定的某个注解,isAnnoationPresent(Class annotationClass)检查指定类型的注解是否存在。下面是AI给出的几个常用的反射注解的方法:

总结

  本文探讨了Java注解的各个方面,从Java注解的引入背景到常见预置注解的介绍,再到自定义注解的定义方法和元注解的使用。我们了解到注解不仅仅是代码中的装饰品,它们可以深刻影响到代码的编译和运行时行为。通过元注解,我们可以控制注解的生命周期以及它们的作用域。最后,我们还讨论了如何利用反射技术来操作注解,从而在运行时获取更多的元数据信息。掌握注解的使用不仅可以提高代码的可维护性和可扩展性,还能促进对现代Java框架的理解与开发。希望本文能够帮助大家在实际开发中更加灵活地运用注解这一强大工具。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux下进程间的通信--共享内存

共享内存概述: 共享内存是进程间通信的一种方式,它允许两个或多个进程共享一个给定的存储区。共享内存是最快的一种IPC形式,因为它允许进程直接对内存进行读写操作,而不需要数据在进程之间复制。 共享内存是进程间通信&#xff…

MySQL基础篇(黑马程序员2022-01-18)

1 MySQL数据库概述 1.1 MySQL数据库的下载,安装,启动停止 1.2 数据模型 (1)关系型数据库(RDBMS) 概念:建立在关系模型基础上,由多张相互连接的二维表组成的数据库。 特点: A. 使用表存储数据,格式统一,便于维护。…

【JavaScript】数据结构之树

什么是树形结构? 一种分层数据的抽象模型,用来分层级关系的。虚拟dom它所组织的那个数据原理就是树形结构 深度优先搜索(遍历)- 递归 从根出发,尽可能深的搜索树的节点技巧 访问根节点对根节点的children挨个进行深…

基于python+django+vue的社区爱心养老管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的社…

mysql的zip解压缩版安装

文章目录 一、MySQL下载二、mysql解压缩版安装1、解压缩2、设置环境变量3、mysql初始化4、安装mysql服务5、启动mysql服务6、连接mysql7、修改初始密码8、安装完成 一、MySQL下载 下载网址:MySQL下载 本文以mysql8.4.2版本为例下载解压缩版。 二、mysql解压缩版安…

ElementUI 快速入门:使用 Vue 脚手架搭建项目

文章目录 一 . ElementUI 的基本安装1.1 通过 Vue 脚手架创建项目1.2 在 vue 脚手架中安装 ElementUI1.3 编写页面 ElementUI 是 Vue.js 的强大 UI 框架,让前端界面开发变得简单高效。本教程将带你从安装到实战,快速掌握 ElementUI 的核心技巧。 核心内容…

MS SQL Server 实战 排查多列之间的值是否重复

目录 需求 范例运行环境 数据样本设计 功能实现 上传EXCEL文件到数据库 SQL语句 小结 需求 在日常的应用中,排查列重复记录是经常遇到的一个问题,但某些需求下,需要我们排查一组列之间是否有重复值的情况。比如我们有一组题库数据&…

【初阶数据结构】排序

目录 一、排序的概念及其运用 1.1排序的概念 1.2常见的排序算法 二、常见排序算法的实现 2 .1插入排序 2 .1.1基本思想: 2.1.2直接插入排序: 算法复杂度: 最坏情况: 最好的情况: 直接插入排序的特性总结&…

React js Router 路由 2, (把写过的几个 app 组合起来)

完整的项目,我已经上传了,资源链接. 起因, 目的: 每次都是新建一个 react 项目,有点繁琐。 刚刚学了路由,不如写一个 大一点的 app ,把前面写过的几个 app, 都包含进去。 这部分感觉就像是, …

BSV区块链上的覆盖网络服务现已开放公测

​​发表时间:2024年8月30日 BSV区块链的覆盖网络服务现已正式开放公测。对于BSV区块链生态系统内的特定交易类型和数据管理及访问,覆盖网络服务都可以为它们提供强大、可扩展、并且合规的解决方案。覆盖网络以及其它即将推出的BSV服务将赋予开发者、企业…

SQL Server开启网络访问

目前工作中很少用到SQL Server了,最近需要测试几个表,需要搭建一个SQL Server数据库服务,这里做个总结吧。 安装这里就不做详细介绍了,本文只介绍如何开启SQL Server网络访问。 1、云服务器安全组设置 如果是搭建在云服务器上&a…

CTF——简单的《MICS》

文章目录 一、MICS1、MISC-LSB2、MISC-循环解压3、MISC-一个不同的压缩包4、MISC-异性相吸5、MISC-仔细找找6、MISC-再来一题隐写7、MISC-找找吧8、MISC-这是一张单纯的图片9、MISC-真假flag10、MISC-真正的黑客才可以看到本质11、MISC-追象者12、MICS-鸡蛋别放在一起 一、MICS…

【双方演化博弈】研究理论学习

1. 演化基础 1.1.演化博弈常用软件 载学习软件: Matlab、Vensim PLE、 Visio 其中,Matlab和Vensim PLE主要是用做演化博弈仿真,Matlab是演化博弈最常用的仿真软件,VensimPLE是系统动力学(SD)仿真软件也是常用仿真软件之一。 Python、Netlogo等软件也可以用来做演…

THREE.js:网页上的3D世界构建者

THREE.js:网页上的3D世界构建者 前言 THREE.js 是一个强大的基于 JavaScript 的库,它使得在网页上创建和展示三维图形变得异常简单。 通过封装复杂的 WebGL 技术,THREE.js 提供了一套丰富的 API,让开发者能够轻松地构建出令人印…

基于web的 BBS论坛管理系统设计与实现

博主介绍:专注于Java .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的可以…

MYSQL基础-多表操作-事务-索引

1. 多表设计 概述 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种: …

网络编程基础概述

文章目录 协议网络协议栈(osi)局域网IPIP和Mac地址端口号TCP和UDP网络字节序 协议 (网络协议的)意义:为了让计算机传输之间将信息正确传输给目标机器 不同系统之间能接入网络是因为定制了一套通用的协议以便支持不同系统间的网络通信 1.网络通信的问题: 将数据可靠的从A传给B a…

Cesium 计算3d凸包(ConvexHull)

Cesium 计算3d凸包(ConvexHull) Cesium 计算3d凸包(ConvexHull)

【Android 13源码分析】WindowContainer窗口层级-2-构建流程

在安卓源码的设计中,将将屏幕分为了37层,不同的窗口将在不同的层级中显示。 对这一块的概念以及相关源码做了详细分析,整理出以下几篇。 【Android 13源码分析】WindowContainer窗口层级-1-初识窗口层级树 【Android 13源码分析】WindowCon…

InputDispatcher的调试日志isLoggable动态开放logcat实战使用

背景: 在学习input专题课程后,那么就可以正常对所有和input相关的问题进行分析,经常分析的类就是InputDispatcher,平时如果看正常的logcat输出,发现InputDispatcher相关的日志非常少,基本上没办法进行有价…