【Java 基础】15 注解

news2025/5/26 10:43:52

文章目录

    • 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.coloradmin.cn/o/1278930.html

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

相关文章

docker部署frp穿透内网

文章目录 (1)部署frps服务器(2)部署frpc客户端(3)重启与访问frp(4)配置nginx反向代理 (1)部署frps服务器 docker安装参考文档:docker基本知识 1…

使用java批量生成Xshell session(*.xsh)文件

背景 工作中需要管理多套环境, 有时需要同时登陆多个节点, 且每个环境用户名密码都一样, 因此需要一个方案来解决动态的批量登录问题. XShell Xshell有session管理功能: 提供了包括记住登录主机、用户名、密码及登录时执行命令或脚本(js,py,vbs)的功能 session被存储在xsh文…

openGauss学习笔记-138 openGauss 数据库运维-例行维护-检查时间一致性

文章目录 openGauss学习笔记-138 openGauss 数据库运维-例行维护-检查时间一致性138.1 操作步骤 openGauss学习笔记-138 openGauss 数据库运维-例行维护-检查时间一致性 数据库事务一致性通过逻辑时钟保证,与操作系统时间无关,但是系统时间不一致会导致…

部署springboot项目到GKE(Google Kubernetes Engine)

GKE是 Google Cloud Platform 提供的托管 Kubernetes 服务,允许用户在 Google 的基础设施上部署、管理和扩展容器。本文介绍如何部署一个简单的springboot项目到GKE. 本文使用podman. 如果你用的是docker, 只需要把本文中所有命令中的podman替换成docker即可 非H…

代码随想录算法训练营第三十四天|62.不同路径,63. 不同路径 II

62. 不同路径 - 力扣(LeetCode) 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” &#…

Git版本管理配置说明 - Visual Studio

一、 Git服务端配置 在源代码管理服务器新建文件夹,并配置共享访问权限Everyone(读取/写入)。 在本地访问这台服务器共享目录,确保正确打开。 在VS中打开项目,点选Git更改,点击“创建Git仓库”,创建项目初始版本。 弹出如下对话框: 因为我们只是在局域网中开发项…

某60区块链安全之Create2实战一学习记录

区块链安全 文章目录 区块链安全Create2实战一实验目的实验环境实验工具实验原理实验内容Create2实战一 实验步骤分析合约源代码漏洞Create2实战一 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约Create2引发的漏洞及其利用 找到合约漏洞进行分析并形成利用 实…

初识金融市场

文章目录 前言第一章 金融市场体系考点二、金融市场分类考点三、金融市场的功能考点四、直接融资与间接融资的特点考点五、全球金融市场的形成及发展趋势考点六、国际资金的流动方式考点七、金融体系的主要参与者考点八、国际金融监管体系 第二章 中国的金融体系与多层次资本市…

爬虫学习-基础(HTTP原理)

目录 一、URL和URI 二、HTTP和HTTPS (1)HTTP (2)HTTPS (3)HTTP与HTTPS区别 (4)HTTPS对HTTP的改进:双问的身份认证 三、TCP协议 (1)TCP三次握手…

Redis——某马点评day02——商铺缓存

什么是缓存 添加Redis缓存 添加商铺缓存 Controller层中 /*** 根据id查询商铺信息* param id 商铺id* return 商铺详情数据*/GetMapping("/{id}")public Result queryShopById(PathVariable("id") Long id) {return shopService.queryById(id);} Service…

XIAO ESP32S3之SenseCraft 模型助手部署

sipeed教程:SenseCraft 模型助手部署 | Seeed Studio Wiki 一、安装ESP-IDF 鉴于我的电脑之前安装过esp-idf v4.3版本,而ESP32-S3需要v4.4及以上版本才支持,所以将esp-idf更新到最新5.1版本。 1、启动mingw32.exe应用 2、进入esp-idf目录 …

docker+jmeter+influxdb+granfana

centos7国内阿里源安装docker 1、安装必要的系统工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 2添加官方仓库 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposudo sed -i sdownload.doc…

Opencv拖动条控制均值滤波卷积核大小,拖动条控制是否保存(涉及知识点:cv2.createTrackbar和cv2.getTrackbarPos的使用)

带拖动条的均值滤波import timeimport cv2 import numpy as npdef callback(int):passcv2.namedWindow(dst,cv2.WINDOW_AUTOSIZE)# 创建trackbar (trackbarname,winname,value,count,callback,userdata) cv2.createTrackbar(ksize, dst, 3, 30, callback) cv2.createTrackbar(s…

QT 中 QTimer 类 备查

基础 // 指定了父对象, 创建的堆内存可以自动析构 QTimer::QTimer(QObject *parent nullptr);// 根据指定的时间间隔启动或者重启定时器, 需要调用 setInterval() 设置时间间隔 void QTimer::start();// 启动或重新启动定时器,超时间隔为msec毫秒。 void QTimer::…

【NeurIPS 2023】PromptIR: Prompting for All-in-One Blind Image Restoration

PromptIR: Prompting for All-in-One Blind Image Restoration, NeurIPS 2023 论文:https://arxiv.org/abs/2306.13090 代码:https://github.com/va1shn9v/promptir 解读:即插即用系列 | PromptIR:MBZUAI提出一种基…

node.js express路由和中间件

目录 路由 解释 使用方式 中间件 解释 使用方式 中间件类型 路由注册和中间件注册 代码 app全局路由接口请求以及代码解析 示例1 示例2 示例3 示例4 中间件req继承 嵌套子路由 解释 代码 示例1 路由 解释 在 Express 中,路由(Route&…

Spring | Spring的基本应用

目录: 1.什么是Spring?2.Spring框架的优点3.Spring的体系结构 (重点★★★) :3.1 Core Container (核心容器) ★★★Beans模块 (★★★) : BeanFactoryCore核心模块 (★★★) : IOCContext上下文模块 (★★★) : ApplicationContextContext-support模块 (★★★)SpE…

Linux中文件的打包压缩、解压,下载到本地——zip,tar指令等

目录 1 .zip后缀名: 1.1 zip指令 1.2 unzip指令 2 .tar后缀名 3. sz 指令 4. rz 指令 5. scp指令 1 .zip后缀名: 1.1 zip指令 语法:zip [namefile.zip] [namefile]... 功能:将目录或者文件压缩成zip格式 常用选项&#xff1a…

《YOLOv8原创自研》专栏介绍 CSDN独家改进创新实战专栏目录

YOLOv8原创自研 https://blog.csdn.net/m0_63774211/category_12511737.html?spm1001.2014.3001.5482 💡💡💡全网独家首发创新(原创),适合paper !!! 💡&a…

QT 中 QProgressDialog 进度条窗口 备查

基础API //两个构造函数 QProgressDialog::QProgressDialog(QWidget *parent nullptr, Qt::WindowFlags f Qt::WindowFlags());QProgressDialog::QProgressDialog(const QString &labelText, const QString &cancelButtonText, int minimum, int maximum, QWidget *…