JavaWeb——2.注解

news2024/11/17 6:02:26

这篇文章我们来讲一下Java中的注解

其实这部分内容算是Javaweb的补充内容,其中还包括Junit测试和反射的相关内容。 Junit测试是一个比较简单的内容,这里就不写了;而反射的相关内容可以看java基础专栏,那里面有详细的叙述。

目录

1.注解概述

2.jdk里面已经定义的注解

2.1 @Override注解

2.2 @Deprecated注解

2.3 @SuppressWarnings(参数)

3.自定义注解

4.在程序中解析注解

5.具体案例


1.注解概述

首先,我们来对注解进行一个全面的认识

注解概念:用来说明程序的,是给计算机看的

格式:@+注解名称

解释:我们知道java里面有注释,注释的概念是:用文字描述程序,给程序员看的;我们类比注释,就给出了注解的概念。唯一不同的是注解是给计算机看的

注解的分类:

  1. 编译检查:通过代码里面标识的注解,让编译器可以实现基本的编译检查,例@Override
  2. 编写文档:通过代码里面标识的注解,来生成文档(生成doc文档,也就是api文档,生成类的文档的命令:javadoc 类名)
  3. 代码分析:通过代码里标识的注解,对代码进行分析(使用反射)

说明:编译检查,很简单,就是程序在编译的时候对代码进行检查,看看它是否符合语法格式,典型的就是对方法的重写时用的注解@Override;编写文档,也很容易理解,就是我们给程序加上注解,然后如果我们要生成api文档,那么就会生成加了注解的部分;代码分析这里先不阐述

关于注解我们要学习的内容:

  1. jdk里面定义的注解
  2. 自定义注解
  3. 在程序中使用(解析)注解

2.jdk里面已经定义的注解

首先,我们先来了解一下jdk里面已经定义了的注解。主要了解以下三个:

  1. @Override 检测被标记的方法是否是基础父类(接口)的
  2. @Deprecated 该注解标识的内容表示已过时
  3. @SuppressWarnings(参数) 用来压制警告的,其中的参数一般传递all,表示压制所有警告

2.1 @Override注解

这个注解就不过多赘述了,我们已经用了很多次了

直接看一下代码吧

很简单,不多讲

2.2 @Deprecated注解

这个注解是用来表示标识的内容已经过时了

注意:是可以用,但是已经过时了。就比如一个程序有了一个新功能,旧的功能过时了,所以我们要对旧的功能进行表示,但是因为还有人会用旧的功能,所以旧的功能还是可以用的

看下代码:

第16行的注解表示方法show1()过时了,所以在第28行输入的时候,idea显示的show1()上面划了条横线,但是注意,show1()方法还是可以用的

2.3 @SuppressWarnings(参数)

@SuppressWarnings(参数)注解是用来压制警告的

具体的看一下代码:

这些标黄的位置就是警告,不是错误,不影响程序运行

然后我们加上注解看一下:

 如图所示,警告就没有了

里面的参数我们一般传入的是all,表示压制所有的警告

对于这个注解,我们一般是直接标识在类上的,这样就可以压制整个类的警告了

 如图所示,我们这整个类都没有警告了

3.自定义注解

下面,我们来尝试一下自定义注解

我们来看一下java中注解的格式:

它大体上是分两部分组成的。第一部分:元注解,就是49和50两行;第二部分:注解定义,就是第51行

所以注解格式如下:

元注解
public @interface MyAnno {

}

我们仿照它也来定义一个注解:

 

 这里再说明一点内容,我们定义了一个注解,然后进行编译,然后在用javap命令反编译,就能看到注解的本质

注解的本质:注解本质上是一个接口,该接口默认继承Annotation接口

接口反编译出来的内容:public interface MyAnno extends java.lang.annotation.Annotation{}

所以说,注解本质上是一个接口,接口里面能写的内容(常量、抽象方法)注解里面都可以写

但是有所要求:

  1. 属性的返回值类型,只能包括:基本数据类型、String、枚举、注解、以上类型的数组,只能包括这五大类
  2. 定义了属性,在使用时要给属性赋值,赋值格式为 属性名=值;还可以使用default关键字给属性赋默认值
  3. 如果只有一个属性需要赋值,并且属性名为value,那么可以直接写值,不用写value

下面来看一个自定义的注解:

这是自定义的注解,里面写了内容

下面看一下这个注解的使用:

 很简单key-value的形式

下面再来讲一下元注解:

元注解:用于描述注解的注解,是jdk已经定义好的
需要掌握的元注解:

  1. @Target:用于描述注解能够作用的位置,三个取值:TYPE:只作用于类上;METHOD:只作用于方法上;FIELD:只作用与成员变量上
  2. @Retention:描述注解被保留的阶段 @Retention(RetentionPolicy.RUNTIME),表示当前被描述的注解会保留到class字节码文件中,并被jvm读取到;我们自己写的注解一般是选RUNTIME
  3. @Document:描述注解是否被抽取到api文档中
  4. @Inherited:描述被该注解描述的注解注释的类的子类会自动继承这个注解

下面来看一下具体的实例:

 我们写自定义的注解时,一般只用前两个注解,后面两个一般不用

注解的定义就是这么多的内容

4.在程序中解析注解

下面我们通过具体的实例来看下注解的在程序中的解析

如图所示,这是我们自定义的一个注解

 这个是我们在程序中使用我们自定义的注解

 这个就是运行的结果

我们在程序中解析注解,实质上就是在程序中获取注解里面的内容,它包含以下三部分:

  1. 获取注解定义的位置的字节码文件
  2. 获取指定的注解
  3. 调用注解中的抽象方法来获取配置的属性值

 这在上面的程序中也是对应上的,运行方法啥的运用的是反射的技术

5.具体案例

情景:你写了一个计算器,能够进行四则运行,现在要求你写一个测试框架,来测试你的计算器是否可以正确运算,如果有错,请返回文件指出错误

代码如下:

 这是计算器类

这是我们写的注解

 这是我们的测试框架

这是运行结果

最后,我们小结一下

我们以后是要会使用注解,而不是自定义注解来使用。注解给谁用?注解给计算机用,给解析程序用(这个解析程序就是类似于我们的TestCheck类),注解是给这二者用的。并且注解不是我们程序的一部分,可以将注解理解为一个标签,它不是程序的一部分。 

 

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

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

相关文章

Jvm jmx_exporter Prometheus dubbo Grafana 重点看端口要对应上 单独进程和程序进程内jmx_exporter

目录 JMX Exporter 的两种用法 启动独立进程 jmx_prometheus_httpserver-0.18.0.jar 方式 下载 jmx_exporter 找地方随便一放 创建配置文件 config_jmx_exporter.yaml 增加 启动 jvm 配置 一定要是jvm参数 可别意外写成程序参数 启动jmx_exporter Prometheus yml 配置 …

使用jmap查看对象数

jmap:JVM自带的一种内存映像工具 查看jmap命令帮助 查询java进程pid # 查看堆内存中的对象 jmap -histo PID# 查看堆内存中的存活对象 jmap -histo:live PID 使用示例: jmap -histo:live 46024|grep com.kingbase8.jdbc.KbConnection 列说明 num#insta…

1.4、Java的标识符 关键字 注释 变量 数据类型与类型转换

1 JAVA语法基础 1.1 标识符 标识符可以简单的理解成一个名字。 在Java中,我们需要给代码中的很多元素起名,包括类名、方法名、字段名、变量名等等。我们给对应元素起的名称就被称为标识符,一个正确的标识符需要遵循以下规则: 1、…

简单实现接口自动化测试(基于python+unittest)

目录 简单实现接口自动化测试(基于pythonunittest) 简介 引言 为什么要做接口自动化测试? 为什么要自己写框架呢? 一个现有的简单接口例子 接口信息如下 测试思路 原始脚本实现 未优化 优化 第一版 优化 第二版 优化 第三版 最终输出日志信息 后续改进建议 总…

ubuntu20.04系统4060安装cuda11.8和cudnn8.6

ubuntu20.04系统4060安装cuda11.8和cudnn8.6 一:安装nvidia-driver-525 1:查看本机显卡能够配置的驱动信息 在终端输入: ubuntu-drivers devices2:推荐安装的版本号是: 安装代码: sudo apt install n…

JPA-querydsl增强工具,query-dsl-plus,现在已开源并推送到mvnrepository

前言 由于喜欢使用JPA,所以后续就接触了query-dsl,但是呢,随着需求的变更,数据查询条件也会越来越复杂(这个和jpa没关系,就算使用mybatis也一样),往往前端改动了,后端还…

【亲测】python 安装 pillow报错 如何处理

今天在新系统上安装pillow库,提示错误: WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by SSLError(SSLEOFError(8, EOF occurred in violation of protocol (_ssl.c:997))): /simple/…

LangChain_ChatGLM部署

环境准备 项目地址:https://github.com/imClumsyPanda/langchain-ChatGLM 下载chatglm-6b模型到本地,大约13G: https://huggingface.co/THUDM/chatglm-6b 里面的文件需要一个个手动点击下载,点击下载时,可能需要多次点…

HBase(8):扫描操作

1 需求 查看ORDER_INFO表中所有的数据 1.2 scan命令 在HBase,我们可以使用scan命令来扫描HBase中的表。语法: scan 表名 1.3 扫描ORDER_INFO表 scan ORDER_INFO,{FORMATTER > toString} 注意:要避免scan一张大表! 2 需求二…

[Arduino] ESP32开发 - LCD1602显示实验

目录 LCD1602硬件准备环境搭设接线获取 IIC 地址显示第一行文本可滚动字符串点灯小案例 LCD1602 实验将利用 LCD1602 显示文本 参考文献:https://randomnerdtutorials.com/esp32-esp8266-i2c-lcd-arduino-ide/ 硬件准备 4 条母对母杜邦线 LCD1602 Esp32-Devkit-V1 …

JProfiler 使用中文说明文档

JProfiler 是一款用于 Java 应用程序性能分析和优化的工具。它可以帮助开发人员识别性能瓶颈、内存泄漏等问题,并提供可视化的分析报告和建议。JProfiler 支持各种 Java 虚拟机、应用服务器和操作系统,可以在本地或远程环境中运行。下载安装完成后对应的…

目标检测模型中的Bells and wisthles

目标检测模型中的Bells and wisthles 目标检测模型中的Bells and wisthles1. Data augmentation 数据增强2. Multi-scale Training/Testing 多尺度训练/测试3. Global Context 全局语境4. Box Refinement/Voting 预测框微调/投票法5. OHEM 在线难例挖掘6. Soft NMS 软化非极大抑…

云原生——云平台操作

❄️作者介绍:奇妙的大歪❄️ 🎀个人名言:但行前路,不负韶华!🎀 🐽个人简介:云计算网络运维专业人员🐽 前言 云:云是网络、互联网的一种比喻说法。 平台&am…

【爬虫】5.2 Selenium编写爬虫程序

1. Selenium 框架介绍 Selenium自动化测试框架是实现自动化测试的一个软件结构和功能组件集合。Selenium自动化测试框架是一个半成品,能够帮助用户实现自动化测试。Selenium是模仿浏览器行为的,当你运行测试类(爬虫)的时候&…

【AIGC】Chatglm2-lora微调

ChatGLM2介绍 ChatGLM2-6B源码地址:https://github.com/THUDM/ChatGLM2-6B ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上,ChatGLM2-6B 引入了如下新特性&…

【Java】Java中的异常

文章目录 一、什么是异常1.1 异常的概念1.2 异常的分类 二、异常的体系结构三、异常的处理3.1 异常的抛出3.2 异常的捕获与处理3.3 异常的处理流程 四、自定义异常类4.1 自定义异常类的规则4.2 自定义异常案例 一、什么是异常 1.1 异常的概念 在Java中,异常&#…

《Linux操作系统编程》第八章 Shell程序设计: shell 语言结构,包括测试、分支、循环、跳转、函数、语句组

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

C++ DAY3

1.思维导图 2.有以下类定义&#xff0c;按要求实现剩余功能 #include <iostream> using namespace std;class Person { private:int age;int *p; public://无参构造Person():p(new int(89)){age 18;}//有参构造Person(int age,int num){this->age age;this->pne…

基于Java实验室开放管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Servlet实现留言墙

目录 1.创建工程 2.构建目录工程结构 3.设置编码格式尾utf-8 4.查看Maven配置 5.一些其他配置​编辑 6.导入依赖 7.导入HTML和JS、配置tomcat 8.测试网站是否可以正常访问 9.编写业务代码 开发环境&#xff1a;idea2022.2社区版 1.创建工程 2.构建目录工程结构 web.xml中的…