【Java 基础】15 注解

文章目录

    • 1.什么是注解
    • 2.元注解
      • 1)定义
      • 2)分类
    • 3.内置注解
    • 4.自定义注解
    • 5.注解的基本语法
    • 6.验证注解是否生效
    • 7.注解的使用场景
    • 8.注解的注意事项
    • 结语

1.什么是注解

注解(Annotation)可以理解成一种特殊的 “注释”

注解定义时以 @ 符号开头,可以写在构造方法方法字段等元素上,为这些元素提供额外的信息。

如下图: 我们为实体类 User 添加了 两个 Lombok 的注解,用以为属性增加 setget 方法
在这里插入图片描述

2.元注解

1)定义

元注解(meta-annotation)是用于注解其他注解的注解

这个听起来或许有一点绕,这些是注解的基础,它们用于提供注解拥有哪些行为信息

如下图:Lombok 在定义 Getter 的时候,使用了两个元注解 @Target 和 @Retention
在这里插入图片描述

2)分类

在这里插入图片描述

  1. @Target 用于指定注解可以应用的程序元素类型,包括 TYPE(类、接口、枚举)、FIELD(字段)、METHOD(方法)等。如果没有 @Target 注解,注解可以应用于任何程序元素。

    @Target(ElementType.TYPE)
    public @interface DemoAnnotation {// 注解的定义
    }
    
  2. @Retention 用于指定注解的生命周期,即注解在何时有效。可以有三个值:SOURCE(源代码时有效)、CLASS(编译时有效,默认值)、RUNTIME(运行时有效),90% 使用的都是 RUNTIME

    @Retention(RetentionPolicy.RUNTIME)
    public @interface DemoAnnotation {// 注解的定义
    }
    
  3. @Documented 用于指定注解是否包含在 Javadoc 文档中。如果一个注解使用了 @Documented,那么它将会被包含在生成的文档中。

    @Documented
    public @interface DemoAnnotation {// 注解的定义
    }
    
  4. @Inherited 用于指定一个注解是否具有继承性。如果一个类使用了带有 @Inherited 的注解,并且其子类没有使用相同的注解,那么子类将继承父类的注解。

    @Inherited
    public @interface DemoAnnotation {// 注解的定义
    }
    
  5. @Repeatable 用于指定注解是否可以重复应用于同一程序元素。如果一个注解使用了 @Repeatable,则可以在同一程序元素上多次使用该注解。

    @Repeatable(MyAnnotations.class)
    public @interface MyAnnotation {// 注解的定义
    }public @interface MyAnnotations {MyAnnotation[] value();
    }
    

上述元注解用于控制注解的行为,提供了更多的灵活性和可定制性。这些元注解的组合使得我们可以更加精细地定义和使用注解,以满足不同的需求。

3.内置注解

Java 提供了一些内置的注解,它们具有特殊的含义和用途。其中几个常用的内置注解包括:

  • @Override 用于标记一个方法是覆盖父类的方法。
  • @Deprecated 用于标记已经过时的方法等,提醒开发者不再使用。
  • @SuppressWarnings 用于抑制编译器警告

4.自定义注解

除了使用内置注解,我们还可以定义自己的注解。自定义注解使用 @interface 关键字,并且可以定义元素(成员变量等)。

例如:

@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface ClassInfoAnnotation {String author();String version() default "1.0.0";String description();
}

上述代码定义了一个名为 ClassInfoAnnotation 的注解,它有三个元素:authorversiondescription

5.注解的基本语法

@interface 注解名 {

}

**示例代码:**这里使用上一步自定义的注解

@ClassInfoAnnotation(author = "Cheney", description = "This class is Hello")
class Test {public void sayHello(){System.out.println("hello");}
}

Test 类上应用了 ClassInfoAnnotation 这个注解,并为元素 authordescription 赋了值,version 使用默认值。

6.验证注解是否生效

在上面两个步骤中,我们定义了一个自己的注解 ClassInfoAnnotation,也在 Test 类上应用了,那么这个注解是否生效了呢?是否可以帮助我们做一些事情呢?

例如:打印类的信息(author,version,description)

示例代码:

    public static void main(String[] args) {// 获取类上的注解ClassInfoAnnotation anno = Test.class.getAnnotation(ClassInfoAnnotation.class);// 打印注解信息System.out.println("Author: " + anno.author());System.out.println("Version: " + anno.version());System.out.println("Description: " + anno.description());}

输出结果:

Author: Cheney
Version: 1.0.0
Description: This class is Hello

7.注解的使用场景

  • 文档生成: 注解可以用于生成文档,例如 Java 中的 Javadoc 工具。
  • 编译时检查: 注解可以用于在编译时进行静态检查,提供更严格的类型检查。
  • 运行时处理: 注解可以在运行时通过反射进行处理,实现动态操作。
  • 代码分析工具: 注解可以被代码分析工具用来检查和验证代码。
  • 框架和库: 许多框架和库使用注解来配置和扩展功能,例如 Spring 框架中的注解驱动开发。

8.注解的注意事项

  • 注解本身并不影响程序的实际逻辑,它只是提供了一些额外的元数据信息。
  • 注解可以包含元素,元素的值可以是基本类型、字符串、枚举、注解或以上类型的数组。
  • 注解的使用需要通过反射或其他工具进行处理。
  • 注解的定义和使用应遵循一定的规范和命名规则。

结语

Java 注解是一种强大的元数据机制,它在代码中提供了一种轻量级的、结构化的方式来添加额外的信息。通过合理地使用注解,开发者可以提高代码的可读性、可维护性,并在一些特定场景中实现更加灵活和强大的功能。

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

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

相关文章

多线程06 单例模式,阻塞队列以及模拟实现

前言 上篇文章我们讲了wait和notify两个方法的使用.至此,多线程的一些基本操作就已经结束了,今天我们来谈谈多线程的一些简单应用场景. 单例模式 单例模式,顾名思义,只有一个实例的模式,我们有两种实现方式,分别是懒汉式和饿汉式,我们来分别给出代码. 饿汉式(此处的饿表示创建实…

详解Spring中的Aop编程原理JDK动态代理和CGLIB动态代理

😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783…

yolov8模型 onnxruntime推理及可视化

参考:https://github.com/ultralytics/ultralytics/blob/main/examples/YOLOv8-ONNXRuntime/main.py 1、yolov8 onnxruntime推理代码 1)导出参考:https://blog.csdn.net/weixin_42357472/article/details/131412851 2)查看保存的模型onnx的输入格式等信息 登录https://n…

使用PCReg.PyTorch项目训练自己的数据集进行点云配准

项目地址: https://github.com/zhulf0804/PCReg.PyTorch/tree/main 网络简介: 网络是基于PointNet Concat FC的,它没有其它复杂的结构,易于复现。因其简洁性,这里暂且把其称作点云配准的Benchmark。因作者源码中复杂…

剑指 Offer(第2版)面试题 14:剪绳子

剑指 Offer(第2版)面试题 14:剪绳子 剑指 Offer(第2版)面试题 14:剪绳子解法1:动态规划解法2:数学 剑指 Offer(第2版)面试题 14:剪绳子 题目来源…

DOM 事件的注册和移除

前端面试大全DOM 事件的注册和移除 🌟经典真题 🌟DOM 注册事件 HTML 元素中注册事件 DOM0 级方式注册事件 DOM2 级方式注册事件 🌟DOM 移除事件 🌟真题解答 🌟总结 🌟经典真题 总结一下 DOM 中如何…

TCP连接为什么是三次握手,而不是两次和四次

答案 阻止重复的历史连接同步初始序列号避免资源浪费 原因 阻止重复的历史连接(首要原因) 考虑这样一种情况: 客户端现在要给服务端建立连接,向服务端发送了一个SYN报文段(第一次握手),以表示请…

固定Microsoft Edge浏览器的位置设置,避免自动回调至中国

问题描述 在使用Copilot等功能时,需要将Microsoft Edge浏览器的位置设置为国外。但每次重新打开浏览器后,位置设置又自动回调至中国,导致每次均需要手动调整。 原因分析 这个问题的出现是因为每次启动Microsoft Edge时,默认打开…

cmake和vscode 下的cmake的使用详解(三)

第七讲:【实战】使用 VSCode 进行完整项目开发 案例:士兵突击 需求: 1. 士兵 许三多 有一把 枪 ,叫做 AK47 2. 士兵 可以 开火 3. 士兵 可以 给枪装填子弹 4. 枪 能够 发射 子弹 5. 枪 能够 装填子弹 ——…

2022年9月6日 Go生态洞察:Go的漏洞管理新支持

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

docker-速通

1.命令-镜像操作 docker pull nginx #下载最新版 docker pull nginx:1.20.1 #下载指定版本 镜像名:版本名(标签) docker images #查看所有镜像 # 如果只写镜像名实际就是redis redis:latest 记住这个不是命令 docker rmi 镜像名:版本号/镜像id…

利用段落检索和生成模型进行开放域问答12.2

利用段落检索和生成模型进行开放域问答 摘要引言2 相关工作3 方法 摘要 事实证明,开放域问答的生成模型具有竞争力,无需借助外部知识。虽然很有希望,但这种方法需要使用具有数十亿个参数的模型,而这些模型的训练和查询成本很高。…

在linux服上部署vue+springboot+nginx项目

一、环境准备 1、安装winscp便于可视化操作linux:winscp安装及关联putty使用_putty.exe没有找到_cherishSpring的博客-CSDN博客 2、安装jdk:linux系统安装jdk-CSDN博客 3、安装mysql:Linux7安装mysql数据库以及navicat远程连接mysql-CSDN博…

Fiddler抓包工具之fiddler设置断点和简单的并发测试

断点有两种方式: 1、全局断点 2、局部断点 全局断点 全局断点的特点是:不能针对一个请求,是给所有抓到的请求打断点 全局断点如何设置: 1、快速设置断点:直接点击底部状态栏断点处 ;点击第一下是请求…

【算法专题】二分查找

二分查找 二分查找1. 二分查找2. 在排序数组中查找元素的第一和最后一个位置3. 搜索插入位置4. x 的平方根5. 山脉数组的峰顶索引6. 寻找峰值7. 寻找旋转排序数组中的最小值8. 点名 二分查找 1. 二分查找 题目链接 -> Leetcode -704.二分查找 Leetcode -704.二分查找 题…

【Geoserver】SLD点位样式(PointSymbolizer)设计全通

SLD文件可以控制geoserver的样式管理,这里专门针对点位进行设计,首先点位的设计需要用到这面这个大标签 之前的项目中已经用到了很多关于面的样式管理,这里新学习的是关于点的样式管理 PointSymbolizer 参考资料地址:https://doc…

LeetCode算法题解(动态规划)|LeetCode1143. 最长公共子序列、LeetCode1035. 不相交的线、LeetCode53. 最大子数组和

一、LeetCode1143. 最长公共子序列 题目链接:1143. 最长公共子序列 题目描述: 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一…

论文编写软件latex安装教程

目录 1.下载安装包2.安装texlive 本人系统为windows,本教程基于windows系统,如果是其它系统请参考对应教程,注意选择对应系统的安装包! 1.下载安装包 有三种集成环境安装包 texlive 是主流的环境,集成了较多的包&…

【数据结构】二叉树---C语言版

二叉树 一、树的概念及结构1.树的概念2.树的相关概念3.树的表示4.树在实际中的应用 二、二叉树的概念及结构1.二叉树的概念2.满二叉树3.完全二叉树4.二叉树的性质5.二叉树的储存结构 三、二叉树的遍历1.前序遍历2.中序遍历3.后序遍历4.层序遍历 四、手撕二叉树(务必…

MySQL 临时数据空间不足导致SQL被killed 的问题与扩展

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内,可以解决你的问题。加群请联系 liuaustin3 ,(共1730人左右 1 2 3 4 5&#xff0…