java之注解的定义和使用

news2024/12/23 10:41:00

初识注解:

注解的概念:

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

注解的格式:

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

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

在这里插入图片描述

注解的使用场景:

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

注解的作用:

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

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

在这里插入图片描述

常见的内置注解:

在这里插入图片描述

Override:

查看API文档:

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

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

Deprecated:

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

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

package Collections;
public class reflect {
 @Deprecated
    public 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{
    @myannotation1
    public 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.coloradmin.cn/o/77937.html

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

相关文章

代码随想录训练营第43天|LeetCode 1049. 最后一块石头的重量 II、494. 目标和、474.一和零

参考 代码随想录 题目一&#xff1a;LeetCode 1049. 最后一块石头的重量 II 这个题和之前的“416 分割等和子集”非常的类似&#xff0c;如果给出的stones[]数组能被分成相等的两个数组&#xff0c;那么剩余石头的最小重量就是0。求解思路和分割等和子集一样&#xff0c;只是…

前端工程化实践——javaScript 手写rollup

webpack打包非常繁琐&#xff0c;打包体积较大。rollup主要打包js库。vue/react/angular都在用rollup作为打包工具。 rollup项目初体验 新增文件夹rollupTest 初始化项目&#xff1a;npm init -y 安装依赖 npm install rollup -D 修改配置文件package.json {"name&q…

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

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

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

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

MAC QT OpenGL 波浪特效

目录 一.MAC QT OpenGL 波浪特效效果演示 1.原始图片2.效果演示 二.MAC QT OpenGL 波浪特效源码下载三.其他平台波浪特效版本 1.IOS 演示效果2.Windows OpenGL ES 演示效果3.Windows OpenGL 演示效果 四.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >>…

安装微信开发者工具及创建小程序

大纲&#xff1a; 一、官网&#xff1a;微信公众平台微信公众平台&#xff0c;给个人、企业和组织提供业务服务与用户管理能力的全新服务平台。https://mp.weixin.qq.com/ 开发者工具下载页面https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html《开发者…

【教学类-22-02】20221210《八款字体的描字帖-4*4格整张-不用订书机》(大班主题《我是中国人-中国字》)

成品样式&#xff1a; 48号字&#xff08;适应2-3个名字的大小&#xff09; 44号字&#xff08;适应4个名字大小&#xff08;2-3个名字也可以用&#xff0c;字会稍微小&#xff09;&#xff09; 打印样式&#xff1a; 背景需求&#xff1a; 观摩中3班做“描花体字”的本子的情…

【前沿技术RPA】 一文了解 UiPath 状态机 State Machine

&#x1f40b;作者简介&#xff1a;博主是一位.Net开发者&#xff0c;同时也是RPA和低代码平台的践行者。 &#x1f42c;个人主页&#xff1a;会敲键盘的肘子 &#x1f430;系列专栏&#xff1a;UiPath &#x1f980;专栏简介&#xff1a;UiPath在传统的RPA&#xff08;Robotic…

【流量回放探索】啄木鸟流量回放平台

啄木鸟流量回放平台 项目简介 本项目是基于RuoYi-Vue单应用版本流量回放引擎基于goreplay演示系统基于newbee-mall-api-go 如果你想从录制开始体验&#xff0c;需要搭建演示系统newbee-mall-api-go &#xff0c;同时需要将gor 部署在演示系统服务中&#xff0c;搭建kafka以便…

[附源码]Python计算机毕业设计SSM基于技术的高校学生勤工俭学管理系统的设计与开发(程序+LW)

项目运行 环境配置&#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…

HBase

1 HBase存储结构 HMaster 1. 监控 RegionServer   2. 处理 RegionServer 故障转移   3. 处理元数据的变更   4. 处理 region 的分配或移除   5. 在空闲时间进行数据的负载均衡   6. 通过 Zookeeper 发布自己的位置给客户端 RegionServer 1. 负责存储 HBase 的实际数…

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

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

分布式计算MapReduce究竟是怎么一回事?

前言 如果要对文件中的内容进行统计&#xff0c;大家觉得怎么做呢&#xff1f;一般的思路都是将不同地方的文件数据读取到内存中&#xff0c;最后集中进行统计。如果数据量少还好&#xff0c;但是面对海量数据、大数据的场景这样真的合适吗&#xff1f;不合适的话&#xff0c;…

1560_AURIX_TC275_NMI Trap以及PMC

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 1. 连同上一次的笔记中最后一页&#xff0c;看得出来NMI的trap软件触发至少是有三种方法。 2. 后半页给出了trap发生的状态的清除操作寄存器。 前面的文字描述部分&#xff0c;几个trap是…

基于jsp+mysql+ssm公共交通失信人员管理系统-计算机毕业设计

项目介绍 本南昌公共交通失信人员管理系统主要包括系统用户管理模块、用户信息管理模块、处罚类型管理、失信人员管理、登录模块、和退出模块等多个模块, 本系统基于SSM(SpringSpringMVCMyBatis)框架,适用于毕业设计&#xff0c;采用javaweb,基于B/S模式,Myeclipse或者eclipse…

手把手教你---猿如意之八大高效利器使用

开篇之前我们可能要来了解一下&#xff0c;《猿如意》是CSDN为提高开发者工作效率&#xff0c;发布客户端和低代码平台产品——《猿如意》&#xff1b;记得第一次在接触猿如意实在今年八月份&#xff0c;之前使用过其他的工具&#xff0c;但是有利有弊&#xff0c;先说下为啥选…

趋势分析 | 零信任实践之关键技术解读

SmartX 趋势分享 SmartX 趋势分享由 SmartX 团队内部分享的权威机构市场报告、全球重要媒体文章精选整理而成。内容涉及现代数据中心相关产业趋势以及金融、医疗、制造等行业全球用户需求与实践前沿洞察。本期&#xff0c;我们分享一篇 Gartner 关于零信任实践策略的文章[1]&am…

[附源码]JAVA毕业设计校园快递联盟系统(系统+LW)

[附源码]JAVA毕业设计校园快递联盟系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

【大数据入门核心技术-Azkaban】(二)Azkaban核心架构

目录 一、核心架构 1、Relational Database(Mysql) 2、Azkaban Web Server 3、Azkaban Executor Server 二、三种运行模式 1、solo server mode 2、two server mode 3、multiple executor mode 一、核心架构 Azkaban架构由三部分构成&#xff1a; 1、Relational Databa…

【chatGPT免注册】openAI机器人直接访问,不需要注册的方法

最近&#xff0c;chat GPT可谓是火出圈了。但是这个服务在国内不可用&#xff0c;网上你能找到的教程无非是注册一个虚拟的手机号去接受短信&#xff0c;可就算你能注册成功&#xff0c;还是无法访问。 还有人说可以去某宝买一个账号&#xff0c;这是可以的&#xff0c;账号的确…