自定义java注解案例

news2024/9/27 23:30:42

今天与大家分享java注解的基本使用,如有哪里有问题,望大家指教。

目录

1. 什么是java注解

2. java注解的分类

2.1 JDK基本注解

2.2 JDK元注解

3. 自定义注解

3.1 自定义注解语法

4. 注解示例

4.1 定义注解

4.2 拦截器

4.3 使用注解

4.4 测试 ​编辑

5. 注解与反射机制

主要方法:


1. 什么是java注解

Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。

2. java注解的分类

2.1 JDK基本注解

例如:
@Override 复写方法
@Deprecated 过时的方法,不建议使用,但目前仍然支持,后期版本可能删除
@SuppressWarnings(value = "unchecked") 压制编辑器警告

2.2 JDK元注解

元注解用于修饰其他的注解

@Retention:定义注解的保留策略

注解作用
@Retention(RetentionPolicy.SOURCE)注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS)默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,请注意,当注解未定义Retention值时,默认值是CLASS,如Java内置注解,@Override、@Deprecated、@SuppressWarnning等
@Retention(RetentionPolicy.RUNTIME)注解会在class字节码文件中存在,在运行时可以通过反射获取到

@Target:指定被修饰的Annotation可以放置的位置(被修饰的目标)

注解作用
@Target(ElementType.TYPE)接口、类
@Target(ElementType.FIELD)属性
@Target(ElementType.METHOD)方法
@Target(ElementType.PARAMETER)方法参数
@Target(ElementType.CONSTRUCTOR)构造函数
@Target(ElementType.LOCAL_VARIABLE)局部变量
@Target(ElementType.ANNOTATION_TYPE)注解
@Target(ElementType.PACKAGE)

可以指定多个位置:如@Target({ElementType.METHOD, ElementType.TYPE}),也就是此注解可以在方法和类上面使用

@Inherited:指定被修饰的Annotation将具有继承性,但这并不是真的继承,只是通过使用@Inherited,可以让子类Class对象使用getAnnotations()获取父类被@Inherited修饰的注解
@Documented:指定被修饰的该Annotation可以被javadoc工具提取成文档.

注:根据Annotation中是否包含成员变量,Annotation可以分为:标记Annotation(无成员变量), 元数据Annotation(有成员变量)。

3. 自定义注解

3.1 自定义注解语法

示例:

//定义注解具有集成性
@Inherited

//保留策略为运行时
@Retention(RetentionPolicy.RUNTIME)

//可以用在方法和类型上
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Tag {
    
    //成员变量
     String name() default "rose";
     
     String description() default "beautiful girl";
}

4. 注解示例

本例通过自定义的注解类来实现一个简单的日志打印功能。用于演示自定义注解的基本用法。

4.1 定义注解

 

4.2 拦截器

使用拦截器对注解进行处理:

4.3 使用注解

定义一个使用注解的方法:

4.4 测试 

5. 注解与反射机制

通过使用AnnotatedElement接口中的方法提取注解中的数据,Class/Constructor/Field/Method/Package这些类都实现了AnnotatedElement接口。
注意:只有当定义Annotation时使用了@Retention(RetentionPolicy.RUNTIME)修饰,JVM才会在装载class文件时提取保存在class文件中的Annotation,该Annotation才会在运行时可见,这样我们才能够解析

主要方法:

返回值方法名作用
<A extends Annotation>getAnnotation(Class<T> annotationClass)返回该程序元素上存在的、指定类型的注释,如果该类型的注释不存在,则返回null
Annotation[]Annotation[] getAnnotations()返回该程序元素上存在的所有注释
booleanboolean isAnnotationPresent(Class<? extends Annotation> annotationClass)判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false
Annotation[]getDeclaredAnnotations()返回直接存在于此元素上的所有注解,注意,不包括父类的注解,调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响,没有则返回长度为0的数组

 

 

 

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

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

相关文章

Kali Linux渗透测试演示——DNS欺骗

目录 一、DNS欺骗 1.介绍 2.原理 二、环境和工具 1.kali Linux和靶机&#xff08;这里选择windows 7&#xff09; 2.ettercap 三、攻击过程 1.首先确认一下Kali和靶机的IP地址以及网关 2.进入ettercap的配置文件 3.打开ettercap&#xff0c;进行主机发现 总结 一、DNS…

MR案例:计算学生成绩

计算学生成绩一、提出任务二、完成任务&#xff08;一&#xff09;准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录&#xff08;二&#xff09;实现步骤1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、创建成绩映射器类5、创建成绩驱动器类6、启动成绩驱动…

adb常用命令(二)

adb:Android下面一个通用的调试工具管理设备或者手机模拟器的状态&#xff0c;进行手机操作:安装软件、卸载软件、系统升级、运行shell命令等adb命令&#xff1a;一、环境配置1&#xff0c;Java--JDK java -version2&#xff0c;SDK adb versionsdk版本管理&#xff08;SDK与…

Spark-RDD(转换算子、行动算子、序列化、依赖关系、持久化、分区器、文件读取和保存、累加器、广播变量)

文章目录RDDRDD特点核心属性执行原理RDD创建RDD并行度与分区内存数据的分区文件数据的并行度和分区RDD转换算子Value类型mapmapPartitionsmapPartitionsWithIndexflatMapglom(获取分区数组)groupByfilterdistinctcoalesce(缩小/扩大分区)repartition(扩大分区)sortBysample双 V…

人工智能 之 机器学习(Machine Learning)

目录 一&#xff1a;机器学习概述 二&#xff1a;机器学习算法 三&#xff1a;机器学习模型 四&#xff1a;机器学习过程 五&#xff1a;机器学习模型验证 六&#xff1a;sklearn模块 一&#xff1a;机器学习概述 程序化处理和机器学习处理&#xff1b; 主观思维和客观思…

python利用read()、readline()、readlines()读取文件

目录 1.语法和用法 2.实例 1.语法和用法 with open(file,moder,encodingNone) as f:#①读取所有文本data1 f.read()#②读取第一行数据data2 f.readline() #③读取所有文本数据 data3 f.readlines() 说明&#xff1a; with …… as ……&#xff1a;用于命名&#xff0c…

2022年总结:打开新世界,踏上新征程

一、前言 于我而言&#xff0c;2022年是我的幸运年&#xff0c;人生发生转折的关键点。同时&#xff0c;也可能是互联网行业、社会经济状况开始扭转的一年。因此&#xff0c;打算在CSDN开始记录下我的第一篇年总结。当然除了是意义特殊外&#xff0c;也还有现实实在的意义&…

【ROS服务通信】服务端和客户端

本文记录下ROS服务通信的实现&#xff0c;首先明确&#xff0c;ROS中的服务通信主要适用于偶然的&#xff0c;有实时要求的场景。服务通信基于客户-服务的架构&#xff0c;在主节点下&#xff0c;由服务端和客户端组成&#xff0c;服务端负责对请求做出响应&#xff0c;客户端发…

SQL Server2019详细安装教程(含JDBC连接)

文章目录一、安装SQL Server引擎1.1、安装SQL Server1.2、SQL Server选项配置二、SQL Server Management Studio&#xff08;SSMS&#xff0c;客户端&#xff09;2.1、安装连接工具2.2、连接SQL Server三、JDBC连接SQLServer提前配置查看SQLSever的启动端口Java代码参考文章一、…

雷神五代笔记本U盘重装系统图文教程

雷神五代笔记本U盘重装系统图文教程分享。有用户使用的雷神五代笔记本开机之后会自动安装很多的软件&#xff0c;导致卡到无法正常使用。这个情况是电脑中了病毒程序导致的&#xff0c;一起来看看如何通过U盘来重新安装系统操作教程吧。 准备工作&#xff1a; 1、U盘一个&#…

蓝桥杯嵌入式串口uart

文章目录前言一、板子串口原理图2.cubeMx配置3.波特率的简单讲解4.代码编写一、发送数据函数二、开启接收中断函数三、中断回调函数四、具体使用总结前言 本篇文章将带大家了解串口的编程&#xff0c;串口在比赛当中和实际工程中都是非常重要的&#xff0c;串口的难度也比较大…

微信小程序自定义tabbar底部菜单

自定义 tabBar 可以让开发者更加灵活地设置 tabBar 样式&#xff0c;以满足更多个性化的场景。 在自定义 tabBar 模式下&#xff0c;为了保证低版本兼容以及区分哪些页面是 tab 页&#xff0c;tabBar 的相关配置项需完整声明&#xff0c;但这些字段不会作用于自定义 tabBar 的渲…

UC伯克利提出AIGC图像编辑新利器InstructPix2Pix,AI模型P图更加精细

原文链接&#xff1a;https://www.techbeat.net/article-info?id4375 作者&#xff1a;seven_ 最近的一些工作向我们展示了AIGC在创造性生成图像、视频等方面的潜力&#xff0c;相信已有很多研究者在沿着这一方向进行拓展式的挖掘和创新。目前已有很多衍生应用出现在了大家眼前…

Java中的类和对象

文章目录1.面向对象和面向过程的含义2.类的定义与使用2.1什么是类2.2类的定义和格式2.3类名的修改方法![在这里插入图片描述](https://img-blog.csdnimg.cn/f126dbd47491402e93bc83bc07f51673.png)3.类和对象3.1类的实例化3.2成员的访问4.this引用4.1为何要this引用4.2什么是th…

java和vue的学生健康管理系统疫情打卡系统

需求&#xff1a;关注学生健康数据以及疫情打卡 系统分两个角色&#xff1a;学生和管理员 演示视频 https://www.bilibili.com/video/BV1iD4y1h74F/?share_sourcecopy_web&vd_sourceed0f04fbb713154db5cc611225d92156 技术&#xff1a;springbootvueelementuipagehelperm…

医疗器械实验室设计基本要求SICOLAB

医疗器械实验室设计基本要求SICOLAB 医疗器械实验室设计、医疗器械实验室装修、医疗器械实验室建设SICOLAB 一、实验室分类 &#xff08;一&#xff09;基础实验室 生物学评价检验实验室、电气安全检验实验室、环境试验检验实验室、手术医疗器械检验实验室、医用材料检验实…

【图像去噪】双立方插值和稀疏表示图像去噪【含Matlab源码 2009期】

⛄一、稀疏表示模型简介 图像的稀疏表示能够更好地表示出图像的特征, 其理论依据就是, 有用的图像信号是有序的, 而噪声普遍是杂乱无章的, 因此可以提取出能够表示图像特有奇异性特征的信息, 比如边缘、线段、条纹、端点等, 再用特定的过完备字典中的原子进行线性组合, 重构出…

JDK的安装及环境变量配置

一、应用安装 1、可以在官网下载jdk&#xff0c;&#xff08;http://www.oracle.com/&#xff09;下载自己适用的版本。 2、双击下载的 .exe安装包文件,如 jdk-8u131-windows-x64.exe。 3、进入安装向导。 4、点击下一步&#xff0c;更改安装路径&#xff0c;我选择安装在d盘…

30分钟看懂linux内核 - page介绍

【推荐阅读】 浅析linux内核网络协议栈--linux bridge 深入理解SR-IOV和IO虚拟化 了解Docker 依赖的linux内核技术 浅谈linux 内核网络 sk_buff 之克隆与复制 深入linux内核架构--进程&线程 内核中最初勾引我好奇心的还是内存管理方面&#xff0c;我们平时编写应用程…

代码随想录训练营第53天|LeetCode 1143.最长公共子序列、1035.不相交的线、53. 最大子序和

参考 代码随想录 题目一&#xff1a;LeetCode 1143.最长公共子序列 确定dp数组下标及其含义 dp[i][j]&#xff1a;字符串text1中的0&#xff5e;i字符构成的字符串和字符串text2中的0&#xff5e;j字符构成的字符串的最长 公共子序列 的长度为dp[i][j]。注意和之前做过的Leet…