java之注解的定义和使用

news/2024/4/29 23:19:53/文章来源:https://blog.csdn.net/m0_64365419/article/details/128261627

初识注解:

注解的概念:

注解是从JDK5.0开始引入的新技术,它不是程序本身,但是和注释有相同的作用,都能够对程序做出一定的解释,并且注解能够被其他编译器所读取

注解的格式:

注解是以“@注释名”开头在代码中存在的,有些特殊的注解还会存在数值等信息

例如我们最常见的如下所示的----重写的注解:

在这里插入图片描述

注解的使用场景:

可以附加在package,class,method,field等上面,相当于为它们添加了额外的辅助信息,可通过反射机制编程实现对这些元数据的访问。

注解的作用:

在某些时候能够起到检查和约束性的行为,举例:

当我们将“hashCode”错写成了“HashCode”,程序就会报错,以便于我们及时的进行修改

在这里插入图片描述

常见的内置注解:

在这里插入图片描述

Override:

查看API文档:

在这里插入图片描述
对于下述方法,如果不加“@override”,程序也可以正常的运行,但是如果加上“@override”,那么就一定要重写或者实现在超类型中声明的方法,并且方法名不允许任意的修改。

 @Overridepublic String toString() {return "Book [id=" + id + ", name=" + name + ", num=" + num+ ", price=" + price + ", money=" + money + ", publish="+ publish + "]";}

Deprecated:

在这里插入图片描述
举例:

如下方法的注解为:“Deprecated”:

package Collections;
public class reflect {@Deprecatedpublic static  void show(){System.out.println("Deprecated");}public static void main(String[]args){show();}
}

输出:

Deprecated

虽然程序能够正常的输出结果,但是在调用该方法的时候,出现了如下所示的情况,这就表明编译器不鼓励使用该程序元素。

在这里插入图片描述

SuppressWarnings:

举例:

在这里插入图片描述在上述代码中,我们定义了变量a,但并未使用它,因此编译器会报出警告,
要想“镇压“”这种警告,我们就可以在程序中添加 @SuppressWarnings("all")

此时变量a不仅变成了普通的黑色,且点击它并未有任何的警告。

在这里插入图片描述但是,“镇压”警告并不是我们所提倡的,因为警告往往能够帮助我们发现代码书写中的错误,以便于我们进行检查。

元注解:

元注解的作用就是负责注解其他注解,java定义了4个标准的meta-annotation类型,他们被用来提供对其他annotation类型作说明

这些类型和他们所支持的类型在java.lang.annotation包中可以找到(@Target,@Retention@Documented,@Inherited)

@Target:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)@Retention:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(SOURCE<CLASS<RUNTIME)@Document:说明该注解将被包含在javadoc中@Inherited:说明子类可以继承父类中的该注释

定义注解的方法:

@interface 注解名

查看Target类,该信息包含注解的适用范围,注解的生命周期,注解的存在位置:

在这里插入图片描述 注:一般情况下将Retention的值定义为:Retention.RUNTIME

其ElementType.xx的类型可为下述这些:

在这里插入图片描述

自定义注解—不含参数:

import java.lang.annotation.*;
public class reflect{@myannotation1public void test(){}
}
@Retention(value= RetentionPolicy.RUNTIME)//表示该注解在运行时仍然有效
@Documented//表示将该注解生成在javadoc中
@Inherited//表示子类可以继承父类的注解
//表示该注解可应用在方法上,如果应用到类上就会报错,
//若还想应用在类上,则可在后面直接添加ElementType.TYPE
@Target({ElementType.METHOD})
@interface myannotation1 {
}

“@Target({ElementType.METHOD})”前没有添加public的原因是,java 程序是从一个 public 类的 main 函数开始执行的,就像 C 程序 是从 main() 函数开始执行一样。,只能有一个public 类是为了给类装载器提供方便,一个 public 类只能定义在以它的类名为文件名的文件中,因此在类中定义注解时,我们往往都会省略public

每个编译单元(文件)都只有一个 public 类,因为每个编译单元都只能有一个公共接
口,用 public 类来实现,该接口可以按照要求包含众多的支持包访问权限的类,如果
有一个以上的 public 类,编译器就会报错,并且 public类的名称必须与文件名相同
(严格区分大小写), 当然一个编译单元内也可以没有 public 类。

自定义注解的特点:

在这里插入图片描述注:“value”也可省略不写

自定义注解—只含一个参数:

当我们在test方法中使用含有一个参数的注解,而我们并未传递任何的参数时,编译器就会如下所示,报错:

在这里插入图片描述
解决办法有两个:

1:在String value()后面加defau "";`,表示默认为空,此时无论是否传递参数都不会报错

在这里插入图片描述

2:在使用该注解时,传递参数

在这里插入图片描述
在上述参数名为“value”时,我们传递参数时,直接使用了具体的参数值,但是当我们的参数名是普通字符的时候,如果还使用该方法进行传递就会报错:

在这里插入图片描述正确的传递方法为:

在这里插入图片描述

自定义注解—含多个参数:

举例:

package Collections;
import java.lang.annotation.*;
public class reflect{@myannotation2(age=19,name="西安",schools={"家里蹲大学","新东方烹饪学校"})public void test(){}
}
@Retention(value= RetentionPolicy.RUNTIME)
@Documented@Inherited
//注解的参数:参数类型+参数名()+default[默认值]可加,可不加;
@Target({ElementType.METHOD,ElementType.TYPE})
@interface myannotation2 {String name();int age() default -1;//如果默认值为-1,代表不存在String[] schools();
}

参数传递的顺序可不同。

总结:参数名为value,在传递参数时,可直接传递参数,不需要写参数名,参数名为普通字符串时,格式为参数名=参数值,多个参数值进行传递时,顺序可以发生调换,并且参数名不允许重复。

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

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

相关文章

平均月薪15k+?自动化测试工程师?3个月教你从“点工”蜕变为“码农”

前言 一、自动化测试工程师平均收入【看图&#xff08;来自职友集&#xff09;】 基本收入都在15k左右&#xff0c;随着技术的越来越牛逼工资也就会越来越高。 我的职业生涯开始和大多数测试人一样&#xff0c;刚开始接触都是纯功能界面测试。那时候在一家电商公司做测试&…

[附源码]计算机毕业设计基于人脸识别的社区防疫管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

SSRF漏洞详解与利用

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是SSRF漏洞详解与利用。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未授权设…

迭代器和生成器

文章目录迭代器和生成器图解迭代器和生成器的关系迭代器容器生成器yield函数生成器表达式总结迭代器和生成器 图解迭代器和生成器的关系 图1-1​ 不管是生成器还是我们的容器&#xff0c;最终都是迭代器&#xff0c;使用next方法进行有规律的获取元素&#xff0c;不需要将元素…

五问补盲(二) | 补盲激光雷达,角分辨率真的是越小越好吗?

HiEV消息&#xff08;文&#xff1a;爱LiDAR的小飞哥&#xff09; 如何简单地判断一款补盲激光雷达的成像效果&#xff1f; 业界通常有几个指标&#xff1a;视场角大小、测距范围&#xff0c;以及角分辨率。 一款优秀的补盲激光雷达&#xff0c;通俗来说&#xff1a;既要看得…

rtl8221b+mcu,2.5g光纤收发器的开发备份

1、rtl8221b是一款2.5g的光电转换的phy 系统的构建如下 为了省成本&#xff0c;不用mac来对接其中的gmii接口直接接光模块 2、mdio和mdc由mcu的gpio来模拟&#xff0c;在csdn上有很多的文章来参考 mdio的参数如下 不想看英文可以参考下面的文章 MDIO(clause 22 与 clause 4…

微服务框架 SpringCloud微服务架构 微服务保护 31 限流规则 31.2 流控模式【关联】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护31 限流规则31.2 流控模式【关联】31.2.1 流控模式31.2.2 流控模式 - 关联31.2.3 小结31 限流规则…

Python模块fileinput操作文件和目录操作总结

前言 之前介绍Python的 pathlib 模块可以有效的路径及文件查找等方便操作&#xff0c;本篇介绍一个相对 readlines() 获取文件内容更高效的用法 fileinput模块 对一个或者多个文件的内容迭代遍历&#xff08;类似文件操作的readlines()&#xff09;,但是返回的是迭代对象&…

【Linux】四、Linux 进程概念(三)|进程优先级|环境变量

目录 七、进程优先级 7.1 基本概念 7.1.1 什么是优先级 7.1.2 为什么存在优先级 7.1.3 Linux 优先级特点 7.2 查看系统进程 7.3 PRI 和 IN 7.4 查看进程优先级和更改进程优先级 7.5 其它概念 7.6 进程切换 八、环境变量 8.1 环境变量基本概念 8.2 常见环境变量 8…

English Learning - L1 站在高处建立灵魂 2022.12.5 周一

English Learning - L1 站在高处建立灵魂 2022.12.5 周一1.1 到底什么是语法1.2 为什么要学习语法口语分广义和狭义讲母语的人为啥不学语法&#xff1f;作为一名二语习得者口语中可不可以没有有语法&#xff1f;1.3 英语&#xff08;听说读写&#xff09;的核心金字塔理论关于词…

与图相关的一些矩阵

目录前言正文邻接矩阵(Adjacency matrix)度矩阵(Degree matrix)关联矩阵(Incidence matrix)拉普拉斯矩阵常规拉普拉斯矩阵拉普拉斯矩阵标准化前言 以无向图为例&#xff0c;介绍与图相关的各种矩阵。我们定义下面的图为 GGG&#xff1a; import networkx as nx import matplo…

redis cluster 集群安装

redis cluster 集群安装 redis集群方案 哨兵集群 如图&#xff0c;实际上还是一个节点对外提供服务&#xff0c;所以虽然是三台机器&#xff0c;但是还是一台机器的并发量&#xff0c;而且master挂了之后&#xff0c;整个集群不能对外提供服务 cluster集群 多个主从集群节点…

编写高质量代码 - 多线程和并发(2)

文章目录1. 使用线程异常处理器提升系统可靠性2. volatile不能保证数据同步3. 异步运算考虑使用Callable接口1. 使用线程异常处理器提升系统可靠性 我们要编写一个Socket应用&#xff0c;监听指定端口&#xff0c;实现数据包的接收和发送逻辑&#xff0c;这在早期系统间进行数据…

微信群营销方式微信群建群营销案例

今天我们以小区微信群营销为例&#xff0c;聊一聊具体的步骤和流程&#xff1a; 1、社群的建立&#xff0c;就是如何找到合适的小区&#xff0c;建立小区专属社群?因此&#xff0c;终端在做小区社群营销之前&#xff0c;需要先对当地所有的潜在小区做一个综合性的分析和评估&a…

ffmpeg库编译安装及入门指南(Windows篇)- 2022年底钜献

最近项目需要&#xff0c;使用了 ffmpeg 做摄像头视频采集和串流。这几天有点时间&#xff0c;打算把相关的一些知识记录分享一下。 在撰写本文时&#xff0c;我又在另外一台电脑上把 ffmpeg 重新安装了一遍&#xff0c;所以绝对真实靠谱&#xff01;如果你觉得文章写得还不错…

Linux消息中间件-RabbitMQ

Linux消息中间件-RabbitMQ 消息中间件 MQ简介 MQ 全称为Message Queue, 消息队列。是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息&#xff08;针对应用程序的数据&#xff09;来通信&#xff0c;而无需专用连接来链接它们。消息传递指的是程序之间通…

cef浏览器加载过程实测ILoadHandler和IRequestHandler

针对方法GetResourceRequestHandler获取资源请求过程中,会多次发生请求,不知道何时加载完的问题,IRequestHandler没有了OnResourceLoadComplete和OnBeforeResourceLoad方法,如何判断是否加载完。使用browser.isLoading并不能真正的判断。所以想到了 OnFrameLoadEnd OnFram…

Spring Cloud Alibaba-全面详解(学习总结---从入门到深化)

​​​​​​​ Spring Cloud Alibaba简介 什么是Spring Cloud Alibaba Spring Cloud Alibaba致力于提供微服务开发的一站式解决方案。 此项目包含开发分布式应用微服务的必需组件&#xff0c;方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。 为…

微服务框架 SpringCloud微服务架构 微服务保护 31 限流规则 31.5 流控效果【排队等待】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护31 限流规则31.5 流控效果【排队等待】31.5.1 流控效果【排队等待】31.5.2 案例31.5.3 总结31 限流…

【Java开发】 Spring 10 :Spring Boot 自动配置原理及实现

用了这么久的 SpringBoot &#xff0c;我们再来回顾一下它&#xff0c;本文介绍 Spring Boot 的自动配置&#xff0c;这是它区别于 Spring 的最大的点&#xff0c;本文的自动配置项目包含三个项目&#xff0c;建议拉取仓库里的代码进行实践&#xff1a;尹煜 / AutoConfigDemo …