当前位置: 首页 > news >正文

Java注解及自定义注解

注解/元数据(Annotation),是对代码级别的说明;在JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明、注释;主要可以用于创建文档,跟踪代码中的依赖性,执行基本编译时检查;注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类;它们都不会直接影响到程序的语义,只是作为标识存在,可以通过反射机制实现对这些元数据(用来描述数据的数据)的访问并且可以在编译时选择代码里的注解是否只存在于源码级,或者也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)。

一、按照作用Annotation有三种作用

1、编写文档(文档注解):通过代码里标识的注解生成文档【生成doc文档,通过 javadoc 类文件名称 的方式生成对应的html文档,文档中会将文档注解进行解析生成内容】

编写类文件,并使用文档注解进行标注:
在这里插入图片描述
使用 javadoc 类文件名称 进行生成文档(这一步可能会报错 错误: 编码GBK的不可映射字符 ,原因是 java程序在编译的时候,需要使用JDK开发工具包中的JAVAC.EXE命令,默认编码格式为UNICODE,而我们的代码并非这个编码格式,解决方案是比如使用 notepad++ 编写Java代码前,先将Java文件的编码格式改为 ANSI编码格式 ,然后编写代码并保存,重新执行javadoc即可(如果没有报错但生成的文档打开中文乱码也可以采用该方法解决)):
在这里插入图片描述
在这里插入图片描述
打开 index.html 文件如下:
在这里插入图片描述
2、代码分析(功能注解):通过代码里标识的注解对代码进行分析【使用反射实现该功能,最重要的功能】
3、编译检查(编译验证注解):通过代码里标识的注解让编译器能够实现基本的编译检查【如:Override,表示这个方法是对父类方法的重写,如果被@Override注解标记的方法父类不存在该方法,那么编译无法通过、编码软件也会提示错误】
在这里插入图片描述

二、Java常见内置注解

1、@Override:作用是对覆盖超类中方法的方法进行标记,如果被标记的方法并没有实际覆盖超类中的方法,则编译器会发出错误警告。
2、@Deprecated:作用是对不应该再使用的方法进行标记(标记方法过时,比如有新版本的方法之后不建议使用以前版本的方法),使用这些方法时,将会在编译时显示提示信息,这些过时方法也是可以正常使用的,只是被提示标记而已,与javadoc里的@deprecated注解的功能相同,但 javadoc @deprecated 可以支持参数。
3、@SuppressWarnings:作用是压制警告;可选值有以下几种(写哪种值就代表压制哪种类型的警告):
deprecation:使用了过时的类或方法时的警告(即被@Deprecated标记的类或方法)
unchecked:执行了未检查的转换时的警告(如使用集合时没有用泛型 (Generics) 来指定集合保存的类型)
fallthrough:当 switch 程序块直接通往下一种情况而没有 break 时的警告
path:在类路径、源文件路径等中有不存在的路径时的警告
serial:当在可序列化的类上缺少serialVersionUID 定义时的警告
finally :任何 finally 子句不能正常完成时的警告
rawtypes:泛型类型未指明
unused 引用定义了,但是没有被使用
all:关于以上所有情况的警告
在这里插入图片描述
在这里插入图片描述

三、元注解

元注解的作用就是负责注解其他注解,Java定义了4个标准的meta-annotation类型他们被用来提供对其他annotation类型作说明,
这些类型和它们所支持的类在java.langannotation包中可以找到(@Target,@Retention,@Documented,@Inherited )。
@Target:用于描述注解的使用范围(即:@Target元注解用来设置注解可以用在什么地方),经常使用最主要的就三个:TYPE、METHOD、FIELD

package java.lang.annotation;/*** The constants of this enumerated type provide a simple classification of the* syntactic locations where annotations may appear in a Java program. These* constants are used in {@link Target java.lang.annotation.Target}* meta-annotations to specify where it is legal to write annotations of a* given type.** <p>The syntactic locations where annotations may appear are split into* <em>declaration contexts</em> , where annotations apply to declarations, and* <em>type contexts</em> , where annotations apply to types used in* declarations and expressions.** <p>The constants {@link #ANNOTATION_TYPE} , {@link #CONSTRUCTOR} , {@link* #FIELD} , {@link #LOCAL_VARIABLE} , {@link #METHOD} , {@link #PACKAGE} ,* {@link #PARAMETER} , {@link #TYPE} , and {@link #TYPE_PARAMETER} correspond* to the declaration contexts in JLS 9.6.4.1.** <p>For example, an annotation whose type is meta-annotated with* {@code @Target(ElementType.FIELD)} may only be written as a modifier for a* field declaration.** <p>The constant {@link #TYPE_USE} corresponds to the 15 type contexts in JLS* 4.11, as well as to two declaration contexts: type declarations (including* annotation type declarations) and type parameter declarations.** <p>For example, an annotation whose type is meta-annotated with* {@code @Target(ElementType.TYPE_USE)} may be written on the type of a field* (or within the type of the field, if it is a nested, parameterized, or array* type), and may also appear as a modifier for, say, a class declaration.** <p>The {@code TYPE_USE} constant includes type declarations and type* parameter declarations as a convenience for designers of type checkers which* give semantics to annotation types. For example, if the annotation type* {@code NonNull} is meta-annotated with* {@code @Target(ElementType.TYPE_USE)}, then {@code @NonNull}* {@code class C {...}} could be treated by a type checker as indicating that* all variables of class {@code C} are non-null, while still allowing* variables of other classes to be non-null or not non-null based on whether* {@code @NonNull} appears at the variable's declaration.** @author  Joshua Bloch* @since 1.5* @jls 9.6.4.1 @Target* @jls 4.1 The Kinds of Types and Values*/
public enum ElementType {/** Class, interface (including annotation type), or enum declaration 类, 接口 (包括注释类型), 或 枚举 声明*/TYPE,/** Field declaration (includes enum constants) 字段声明(包括枚举常量)*/FIELD,/** Method declaration 方法声明(Method declaration)*/METHOD,/** Formal parameter declaration 正式的参数声明*/PARAMETER,/** Constructor declaration 构造函数声明*/CONSTRUCTOR,/** Local variable declaration 局部变量声明*/LOCAL_VARIABLE,/** Annotation type declaration 注解类型声明*/ANNOTATION_TYPE,/** Package declaration 包声明*/PACKAGE,/*** Type parameter declaration 类型参数声明** @since 1.8*/TYPE_PARAMETER,/*** Use of a type 使用的类型** @since 1.8*/TYPE_USE
}

@Retention:表示需要在什么级别保存该注解信息,用于描述注解的生命周期 (可选值:SOURCE <CLASS < RUNTIME)
在这里插入图片描述
@Documented:说明该注解将被包含在javadoc中(即注解是否被抽取到api文档中,使用 javadoc 类文件名称 命令生成文档时将该注解是否保留在文档中)
@Inherited:说明子类可以继承父类中使用的被@Inherited注解标记的注解(比如:A类是B类的父类,如果在A类上使用被@Inherited元注解声明的注解,那么B类也会继承该注解,会自动加上该注解)

四、自定义注解

1、格式:
元注解
public @interface 注解名称{
注解属性列表(即接口中的抽象方法)
}

package com.database.pool.testpool.annotation;import java.lang.annotation.*;/*** 测试注解1*/
@Target(value = ElementType.TYPE)  //元注解定义当前注解可使用范围
@Retention(value = RetentionPolicy.RUNTIME)  //元注解定义当前注解生命周期
@Inherited  //元注解定义子类可以继承父类中使用的该注解
public @interface Test1Annotation {//属性String value();
}

2、本质 :注解本质上就是一个接口,该接口默认继承Annotation接口
public interface Test1Annotation extends java.lang.annotation.Annotation {}
在这里插入图片描述
3、注解属性说明 : 接口中的抽象方法
a、属性(抽象方法)返回值要求,只能是以下几种类型:

  • 八大基本数据类型
  • String
  • 枚举
  • 注解
  • 以上四种类型的数组

b、使用注解时需要给属性赋值要求如下:

  • 定义了属性使用时就必须给属性赋值(格式:@注解名(属性名1=属性值1,属性名2=属性值2))。
  • 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行该属性的赋值会自动使用默认值。
  • 使用注解时如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可也就是说注解只有一个value名称的属性或注解有多个属性,但这些属性都有默认值,所以使用时只需要对value属性赋值的话也可以直接写值。
  • 数组属性赋值时,值使用{}包裹属性值,如果数组中只有一个值,则{}省略,直接写值。

建议注解如果只有一个属性,那么将该属性名定义为value。

示例:
自定义注解:

package com.database.pool.testpool.annotation;import com.database.pool.testpool.User;import java.lang.annotation.*;/*** 测试注解1*/
@Target(value = ElementType.TYPE)  //元注解定义当前注解可使用范围
@Retention(value = RetentionPolicy.RUNTIME)  //元注解定义当前注解生命周期
@Inherited  //元注解定义子类可以继承父类中的该注解,子类可以继承父类使用的注解
public @interface Test1Annotation {/*** 属性(抽象方法)定义* @return*/int paramInt();//default 标记属性默认值,使用注解时该属性如果不做更改使用默认值时可以不设置该属性的值String paramStr() default "c";//返回类型是另一个注解类型Test1Annotation2 paramAnn();//返回类型是枚举User paramUser();String[] paramStrArr();//value名称的属性,在使用注解时如果只有value属性设置值则可以省略属性名value直接写值String value();
}

测试注解2:

package com.database.pool.testpool.annotation;import java.lang.annotation.*;/*** 测试注解2,用于给测试注解1的属性设置返回值为注解类型*/
@Target(value = ElementType.TYPE)
@Retention(value = RetentionPolicy.RUNTIME)
@Inherited
public @interface Test1Annotation2 {
}

枚举:

package com.database.pool.testpool;/*** 定义枚举,用于设置测试注解1的属性返回值为枚举类型*/
public enum User {U1,U2;}

使用注解:

package com.database.pool.testpool;import com.database.pool.testpool.annotation.Test1Annotation;
import com.database.pool.testpool.annotation.Test1Annotation2;/*** 测试注解1使用类*/
@Test1Annotation(paramInt = 1,paramAnn = @Test1Annotation2,paramStrArr = {"a","b"},paramUser = User.U1,value = "x")
public class TestAnn {
}

解析注解:

package com.database.pool.testpool;import com.database.pool.testpool.annotation.Test1Annotation;/*** 反射解析自定义注解---测试注解1*/
public class Test {public static void main(String[] args) {//获取Class对象Class<TestAnn> aClass = TestAnn.class;//获取类级别的Test1Annotation类型的注解,实际上返回值是一个实现了Test1Annotation注解接口的类的对象,里面有获取各个属性的值的方法Test1Annotation annotation = aClass.getAnnotation(Test1Annotation.class);//拿到注解信息后就可以根据注解信息做各种操作int i = annotation.paramInt();System.out.println("paramInt:"+i);String s = annotation.paramStr();System.out.println("paramStr:"+s);String value = annotation.value();System.out.println("value:"+value);}}

总结:
1、程序开发中大部分时候是使用注解,而不是自定义注解
2、注解给谁用 ? 编译器(编译器识别注解),给解析程序用(解析程序通过解析注解实现自定义功能)
3、注解不是程序的一部分(相当于是给程序做了一个标记,然后通过反射机制实现注解功能,对程序原有功能做增强等)
Java反射
Java泛型

相关文章:

Java注解及自定义注解

注解/元数据&#xff08;Annotation&#xff09;&#xff0c;是对代码级别的说明&#xff1b;在JDK1.5及以后版本引入的一个特性&#xff0c;与类、接口、枚举是在同一个层次。可以声明在包、类、字段、方法、局部变量、方法参数等的前面&#xff0c;用来对这些元素进行说明、注…...

ps2024滤镜插件Portraiture

Photoshop 是最常用到的综合性的设计工具&#xff0c;虽然PS一直在迭代升级&#xff0c;但是在细节功能上&#xff0c;PS总是无法完全满足全部所有的用户需求&#xff0c;今天coco玛奇朵推荐一个个截至目前最受欢迎的免费的PS插件&#xff0c;有了这些功能扩展的插件后PS如虎添…...

Vue 实战项目(智慧商城项目): 完整的订单购物管理功能 内涵资源代码 基于Vant组件库 Vuex态管理 基于企业级项目开发规范

鹏鹏老师的实战开发项目 文章目录 智慧商城项目01. 项目功能演示1.明确功能模块2.项目收获 02. 项目创建目录初始化vue-cli 建项目 03. 调整初始化目录结构1.删除文件2.修改文件3.新增目录 04. vant组件库及Vue周边的其他组件库05. 全部导入和按需导入的区别06. 全部导入07. 按…...

JVM——一些零散的概念(后续学习深入了再补充)

Native 凡是带了native关键字的&#xff0c;说明Java的作用范围的达不到了&#xff0c;需要调用底层C语言的库 调用native方法&#xff0c;会进入本地方法栈&#xff0c;调用本地接口(JNI) JNI的作用&#xff1a;扩展Java的使用&#xff0c;融合不同的编程语言为Java所用 它在内…...

OpenCV学习(三)——响应鼠标事件(获取点击点坐标和颜色,利用鼠标进行绘图)

响应鼠标事件 3. 响应鼠标事件3.1 获取鼠标点击的坐标3.2 获取鼠标点击像素点的颜色3.3 在鼠标点击的位置生成圆3.4 通过拖动鼠标来绘制填充矩形3.5 通过拖动鼠标绘制未填充矩形3.6 使用鼠标选点绘制多边形3.7 按住鼠标左键进行绘图 3. 响应鼠标事件 使用OpenCV读取图像&#…...

基于安卓android微信小程序的投票系统

项目介绍 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;投票系统小程序被用户普遍使用&#xff0c;为方便用户…...

没有上司的舞会

有了上一篇博客&#xff0c;没有看上一篇博客的可以看看上一篇博客&#xff0c;我们对没有上司的舞会这道题会有更好的理解~ 所以关键的思路就是确定对于每一个节点我们应该维护什么内容才是最合适的&#xff0c;这个题目和上一篇博客的最后一道题目很相似&#xff0c;我们思考…...

2.18每日一题(不直接给f(x)的定积分及变上限积分)

...

RHCE8 资料整理(四)

RHCE8 资料整理 第四篇 存储管理第13章 硬盘管理13.1 对磁盘进行分区13.2 交换分区&#xff08;swap分区&#xff09; 第14章 文件系统14.1 了解文件系统14.2 了解硬链接14.3 创建文件系统14.4 挂载文件系统14.5 设置永久挂载14.6 查找文件14.7 find的用法 第15章 逻辑卷管理15…...

目标跟踪ZoomTrack: Target-aware Non-uniform Resizing for Efficient Visual Tracking

论文作者&#xff1a;Yutong Kou,Jin Gao,Bing Li,Gang Wang,Weiming Hu,Yizheng Wang,Liang Li 作者单位&#xff1a;CASIA; University of Chinese Academy of Sciences; ShanghaiTech University; Beijing Institute of Basic Medical Sciences; People AI, Inc 论文链接&…...

Flink Data Sink

本专栏案例代码和数据集链接: https://download.csdn.net/download/shangjg03/88477960 1. Data Sinks 在使用 Flink 进行数据处理时,数据经 Data Source 流入,然后通过系列 Transformations 的转化,最终可以通过 Sink 将计算结果进行输出,Flink Data Sinks 就是用于定义…...

机器学习——正则化

正则化 在机器学习学习中往往不知道需要不知道选取的特征个数&#xff0c;假如特征个数选取过少&#xff0c;容易造成欠拟合&#xff0c;特征个数选取过多&#xff0c;则容易造成过拟合。由此为了保证模型能够很好的拟合样本&#xff0c;同时为了不要出现过拟合现象&#xff0…...

【c++】打家劫舍(动态规划)

打家劫舍 题目难度&#xff1a;高阶 时间限制&#xff1a;1000ms 内存限制&#xff1a;256mb 题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff…...

eslint提示 xxx should be listed in the project's dependencies

有时候手动安装了一个npm包A&#xff0c;npm包A里面包含了npm包B&#xff0c;这时候如果 import xxx from npm包B;eslint会报错&#xff0c;提示 npm包B 不在 package.json 里面 解决方法&#xff1a;在 eslintrc.js 增加配置 module.exports {rules: {import/no-extraneous-d…...

H3C LC-5120-52SC-HI配置管理IP

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、MGMT是什么&#xff1f;二、配置步骤1.连接ConsoleWindowsLinux1.配置minicom2.使用minicom 2.配置管理端口3.配置Web管理4.http其它配置项 总结 前言 最近…...

数据结构与算法之排序: 归并排序 (Javascript版)

排序 排序&#xff1a;把某个乱序的数组变成升序或降序的数组 (这里用数组来做举例) 归并排序 该排序属于 分治 策略将一个问题分解为两个问题来计算&#xff0c;计算完成之后&#xff0c;就会得到子任务的解&#xff0c;这些解不是最终问题的解&#xff0c;还需要merge起来…...

Java练习题2021-2

"某地大数据防疫平台记录了往来的所有防疫相关信息&#xff0c;包括 本地或外地人员、健康码颜色、接种疫苗情况、最近一次核酸结果、最近一次核酸检测时间等。 该地某区域对于进入人员的要求为&#xff1a; 如果是本地人员&#xff0c;需要绿码和疫苗完全接种方可进入&am…...

深度学习面试题目01

01 什么是神经网络&#xff1f;02 请解释前馈神经网络&#xff08;Feedforward Neural Network&#xff09;的工作原理。03 什么是激活函数&#xff0c;为什么它在神经网络中重要&#xff1f;04 请解释反向传播算法&#xff08;Backpropagation&#xff09;05 什么是过拟合&…...

ESP32网络开发实例-HTTP-POST请求

HTTP-POST请求 文章目录 HTTP-POST请求1、HTTP POST2、软件准备3、硬件准备4、代码实现在本文中,我们将介绍如何使用 ESP32向 ThingSpeak等常用 API 发出 HTTP POST 请求。 1、HTTP POST 超文本传输协议 (HTTP) 用作服务器和客户端之间的请求-响应协议。 它使它们之间的通信顺…...

怎么把成绩发给家长

亲爱的小伙伴们&#xff0c;作为老师&#xff0c;我们经常需要将学生的成绩发送给家长。但是&#xff0c;手动发送成绩不仅效率低&#xff0c;还容易出错。这时候&#xff0c;我们就需要一个强大的工具——成绩查询系统。它不仅可以轻松实现学生成绩的录入、存储和查询&#xf…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7

在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤&#xff1a; 第一步&#xff1a; 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为&#xff1a; // 改为 v…...

鸿蒙HarmonyOS 5军旗小游戏实现指南

1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;采用DevEco Studio实现&#xff0c;包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...

41道Django高频题整理(附答案背诵版)

解释一下 Django 和 Tornado 的关系&#xff1f; Django和Tornado都是Python的web框架&#xff0c;但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架&#xff0c;鼓励快速开发和干净、实用的设计。它遵循MVC设计&#xff0c;并强调代码复用。Django有…...

Qt Quick Controls模块功能及架构

Qt Quick Controls是Qt Quick的一个附加模块&#xff0c;提供了一套用于构建完整用户界面的UI控件。在Qt 6.0中&#xff0c;这个模块经历了重大重构和改进。 一、主要功能和特点 1. 架构重构 完全重写了底层架构&#xff0c;与Qt Quick更紧密集成 移除了对Qt Widgets的依赖&…...