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注解及自定义注解
注解/元数据(Annotation),是对代码级别的说明;在JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明、注…...

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

Vue 实战项目(智慧商城项目): 完整的订单购物管理功能 内涵资源代码 基于Vant组件库 Vuex态管理 基于企业级项目开发规范
鹏鹏老师的实战开发项目 文章目录 智慧商城项目01. 项目功能演示1.明确功能模块2.项目收获 02. 项目创建目录初始化vue-cli 建项目 03. 调整初始化目录结构1.删除文件2.修改文件3.新增目录 04. vant组件库及Vue周边的其他组件库05. 全部导入和按需导入的区别06. 全部导入07. 按…...

JVM——一些零散的概念(后续学习深入了再补充)
Native 凡是带了native关键字的,说明Java的作用范围的达不到了,需要调用底层C语言的库 调用native方法,会进入本地方法栈,调用本地接口(JNI) JNI的作用:扩展Java的使用,融合不同的编程语言为Java所用 它在内…...

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

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

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

RHCE8 资料整理(四)
RHCE8 资料整理 第四篇 存储管理第13章 硬盘管理13.1 对磁盘进行分区13.2 交换分区(swap分区) 第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
论文作者:Yutong Kou,Jin Gao,Bing Li,Gang Wang,Weiming Hu,Yizheng Wang,Liang Li 作者单位: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 就是用于定义…...

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

【c++】打家劫舍(动态规划)
打家劫舍 题目难度:高阶 时间限制:1000ms 内存限制:256mb 题目描述 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统ÿ…...

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

H3C LC-5120-52SC-HI配置管理IP
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、MGMT是什么?二、配置步骤1.连接ConsoleWindowsLinux1.配置minicom2.使用minicom 2.配置管理端口3.配置Web管理4.http其它配置项 总结 前言 最近…...

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

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

深度学习面试题目01
01 什么是神经网络?02 请解释前馈神经网络(Feedforward Neural Network)的工作原理。03 什么是激活函数,为什么它在神经网络中重要?04 请解释反向传播算法(Backpropagation)05 什么是过拟合&…...

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

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

Banana Pi BPI-W3 RK3588开发板基本使用文档
RK3588编译&烧录Linux固件 1、开发环境及工具准备 Rockchip Linux 软件包:linux-5.10-gen-rkr4 主机: 安装VMware搭建虚拟机,版本为Ubuntu 20.04 (硬盘容量大于100G)安装远程连接工具MobaXterm(可连接虚拟机方…...

源码解析SpringMVC之RequestMapping注解原理
1、启动初始化 核心:得到应用上下文中存在的全部bean后依次遍历,分析每一个目标handler & 目标方法存在的注解RequestMapping,将其相关属性封装为实例RequestMappingInfo。最终将 uri & handler 之间的映射关系维护在类AbstractHand…...

biocParallel学习
我好像做了一个愚蠢的测试 rm(listls()) suppressPackageStartupMessages({library(SingleCellExperiment)library(scMerge)library(scater)library(Matrix) })setwd("/Users/yxk/Desktop/test/R_parallel/") load("./data/exprsMat.RData") load(".…...

AWTK实现汽车仪表Cluster/DashBoard嵌入式GUI开发(六):一个AWTK工程
一个AWTK工程基于C/C++编写,可以分为如下几步: 结合下图,看懂启动的部分。一般一个AWTK工程,需要实现哪些部分,就是其中开始之后白色的部分,比如调用main函数和gui_app_start时会做一些操作,比如asset_init和application_init时要做一些设置,还有退出的函数application…...

MySQL主从复制(基于binlog日志方式)
目录 一、什么是主从复制?二、主从复制原理、存在问题和解决方法2.1.主从复制原理2.2.主从复制存在的问题以及解决办法2.3.主从复制的同步模型2.4.拓展—Mysql并行复制 三、主从复制之基于binlog日志方式3.1.bin-log日志简介3.2.bin-log的使用3.2.1.开启binlog3.2.2…...

计算机网络【CN】介质访问控制
信道划分介质访问控制 FDMTDMWDMCDM【掌握eg即可】 随机介质访问控制 CSMA 1-坚持CSMA 非坚持CSMA p-坚持CSMA 空闲时 立即发送数据 立即发送数据 以概率P发送数据,以概率1-p推迟到下一个时隙 忙碌时 继续坚持侦听 放弃侦听,等待一个随机的时…...

CDR和AI哪个软件更好用?
设计软件市场中,CorelDRAW和Adobe Illustrator(简称AI)无疑是两大重量级选手。它们各自拥有庞大的用户群和丰富的功能,但究竟哪一个更好用?本文将从多个角度出发,对这两款软件进行全面而深入的比较…...

保姆级认识AVL树【C++】(精讲:AVL Insert)
目录 前言 一,概念 二,定义 三,insert 1. 插入情况 情况一: 情况二: 情况三: 2. 旋转方法 法一:左单旋法 法二:右单旋法 法三:先左后右双旋法 法四…...

pinia中使用reactive声明变量,子页面使用时,值未改变,即不是响应式的(解决方法)
reactive赋值无效!reactive 不要直接data赋值!!!会丢失响应式的,只能通过obj.属性 属性值赋值 方法一. pinia中直接使用ref定义变量即可 export const useUserStoredefineStore(user,()>{let loginUserreactive({…...

基于springboot零食商城管理系统
功能如图所示 摘要 这基于Spring Boot的零食商城管理系统提供了强大的购物车和订单管理功能。用户可以在系统中浏览零食产品,并将它们添加到购物车中。购物车可以保存用户的选购商品,允许随时查看已选择的商品和它们的数量。一旦用户满意,他们…...