Java 中 注解是什么?如何使用

news2024/10/5 16:21:36

当谈到 Java 中的注解时,我们指的是 Java 5 中引入的一种元数据机制,它允许我们在代码中添加元数据信息并在运行时读取它们。在本文中,我们将深入探讨 Java 中的注解,包括它们是什么、如何使用它们以及一些示例代码。

在这里插入图片描述

注解是什么?

简而言之,注解是一种元数据机制,它允许我们向代码添加元数据信息。在 Java 中,我们可以使用注解来提供编译器和运行时的指导信息。注解的语法类似于接口,使用 @ 符号来表示。

我们可以将注解看作是一种特殊的接口,它可以应用于其他类、方法或变量。与接口不同,注解不需要被实现,而是被编译器或运行时处理。注解通常用于描述代码的行为、属性和约束。

如何使用注解?

在 Java 中,我们可以使用注解来为类、方法或变量添加元数据信息。下面是一个简单的示例,展示如何使用注解来描述一个方法:

@Deprecated
public void oldMethod() {
  // ...
}

在上面的示例中,我们使用 @Deprecated 注解来标记 oldMethod 方法已经过时。这个注解告诉编译器,这个方法不应该被使用,如果使用了这个方法,编译器会发出警告。

除了 @Deprecated 注解,Java 还提供了许多其他注解,包括:

  • @Override:用于标记方法覆盖了超类中的方法。
  • @SuppressWarnings:用于抑制编译器警告。
  • @SafeVarargs:用于标记可变参数方法是类型安全的。

我们还可以使用自定义注解来提供我们自己的元数据信息。例如,我们可以定义一个注解来标记一个方法是可重试的:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Retryable {
  int maxRetries() default 3;
}

在上面的示例中,我们定义了一个名为 @Retryable 的注解,它有一个 maxRetries 属性,它的默认值为 3。我们可以将这个注解应用于一个方法上,如下所示:

@Retryable(maxRetries = 5)
public void retryableMethod() {
  // ...
}

在上面的示例中,我们将 @Retryable 注解应用于 retryableMethod 方法上,并设置 maxRetries 属性为 5。

注解的保留策略

在 Java 中,注解有三种保留策略,即 SOURCECLASSRUNTIME。保留策略指定注解的生命周期,即注解在何时保留。

  • SOURCE:注解只在源代码中保留,编译器会忽略它们。
  • CLASS:注解在编译时保留,但在运行时会被忽略。
  • RUNTIME:注解在运行时保留,可以通过反射读取它们。

默认情况下,注解的保留策略为 CLASS。如果我们想要在运行时读取注解,必须将它们的保留策略设置为 RUNTIME

注解的元素

注解可以包含元素,这些元素类似于接口的方法,它们定义了注解的属性。元素可以有默认值,也可以被赋值。下面是一个示例注解,它包含两个元素:

public @interface MyAnnotation {
  String value();
  String name() default "defaultName";
}

在上面的示例中,我们定义了一个名为 MyAnnotation 的注解,它有两个元素:valuenamevalue 元素是必需的,而 name 元素有一个默认值为 “defaultName”。我们可以使用这个注解来标记一个类:

@MyAnnotation(value = "exampleValue", name = "exampleName")
public class ExampleClass {
  // ...
}

在上面的示例中,我们将 @MyAnnotation 注解应用于 ExampleClass 类上,并设置 valuename 元素的值。

示例代码

下面是一个简单的示例,演示如何使用注解来描述一个方法,并在运行时读取它:

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
  String value();
}

public class ExampleClass {
  @MyAnnotation(value = "exampleValue")
  public void exampleMethod() {
    System.out.println("This is an example method.");
  }

  public static void main(String[] args) throws Exception {
    ExampleClass example = new ExampleClass();
    example.exampleMethod();

    Method method = example.getClass().getMethod("exampleMethod");
    MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
    System.out.println(annotation.value());
  }
}

在上面的示例中,我们定义了一个名为 MyAnnotation 的注解,并将它应用于 exampleMethod 方法上。在 main 方法中,我们使用反射获取 exampleMethod 方法,并读取它上面的 MyAnnotation 注解的值。

总结

在本文中,我们深入探讨了 Java 中的注解,包括它们是什么、如何使用它们以及一些示例代码。注解是一种有用的元数据机制,它允许我们为代码添加元数据信息,并在编译器和运行时期间读取它们。我们可以使用 Java 提供的预定义注解,也可以定义自己的注解。注解的保留策略和元素可以帮助我们定义注解的生命周期和属性。

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

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

相关文章

浅读《商用密码应用性评估白皮书》

浅读《商用密码应用性评估白皮书》 密码的重要性商用密码概念商用密码典型应用场景(一)电信和互联网领域(二)工业互联网领域(三)车联网领域(四)物联网领域(五&#xff09…

路径规划算法:基于驾驶训练优化的路径规划算法- 附代码

路径规划算法:基于驾驶训练优化的路径规划算法- 附代码 文章目录 路径规划算法:基于驾驶训练优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化…

Redis实战篇(五)

8、达人探店 8.1 达人探店-发布探店笔记 探店笔记类似点评网站的评价,往往是图文结合。对应的表有两个: tb_blog:探店笔记表,包含笔记中的标题、文字、图片等tb_blog_comments:其他用户对探店笔记的评价 具体发布流…

使用SiO2和高介电常数介质的SiC功率MOSFET的栅极阻抗分析

Impedance n.阻抗 dielectric n.电解质 propagation n.传播 标题:Gate Impedance Analysis of SiC power MOSFETs with SiO2 and High-κ Dielectric 阅读日期:2023.7.13 研究了什么 这篇论文研究了SiC功率MOSFET的门电阻Zgg特性,包括SiO2…

大语言模型举例和相关论文推荐

大语言模型如火如荼。甚至已经爆发了“百模大战” 2023年,“百模大战”,一触即发。 因为工作需要,我除了参加行业、企业、研究机构的发布会和闭门会,还需要基于自身的业务,不断了解最新的AI大模型和AIGC应用。 2024…

Java线程状态

Java线程状态 有哪几种 在Java中,线程可以存在多种状态。以下是常见的几种线程状态: 新建状态(New):当创建一个线程对象时,线程即处于新建状态。此时尚未调用线程的start()方法。 可运行状态(…

26-分布式锁

1、JMeter下载安装 Index of /dist/jmeter/binaries 1.1、JMeter配置 1.1.1、JMeter页面显示中文 将jmeter.properties文件中的language=zh_CN。 1.1.2、JMeter发送请求返回的Response显示中文 将jmeter.properties文件中的sampleresult.default.encoding=UTF-8 1.2、启…

Vue绑定class样式

效果&#xff1a;指定变换成某种颜色 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>.basic{width: 400px;height: 100px;border: 1px solid black;}.happy{backg…

Redis数据类型和使用场景

Redis五大基本数据结构 String,Hash,List,Set,ZSet String String是Redis最基本的数据结构&#xff0c;用来设置KV键值对&#xff0c;redis有16个数据库&#xff0c;可直接在当前数据库中set添加String的KV对。 使用场景 KV对&#xff0c;记录学生ID和姓名。<ID, NAME&g…

【高效】极致简化vuex.js(仅需6行代码),让快速敏捷开发不是梦!

vuex.js import Vue from vue; import Vuex from vuex; Vue.use(Vuex); // 设置vuex所有变量 let state {_qiangGe: false,//需要添加全局变量就在此处回车添加一个即可&#xff0c;非常方便&#xff01;&#xff01;&#xff01; }, getters {}, mutations {}, actions …

Spring【Spring体系结构、IOC_控制反转思想、Spring实现IOC 】(一)-全面详解(学习总结---从入门到深化)

目录 Spring简介 Spring体系结构 IOC_控制反转思想 IOC_自定义对象容器 IOC_Spring实现IOC IOC_Spring容器类型 IOC_对象的创建方式 Spring简介 Spring是一个开源框架&#xff0c;为简化企业级开发而生。它以IOC&#xff08;控制 反转&#xff09;和AOP&#xff0…

视频转动图怎么做?一招轻松学会

当需要将下载的视频转gif动图时&#xff0c;该怎样来操作才能更加的简单快捷&#xff0c;相信很多小伙伴都会遇到这个问题。那么想要将视频做成二维码&#xff0c;一般情况下可以使用gif制作工具来处理&#xff0c;对于不经常制作的小伙伴而言&#xff0c;下载视频转gif&#x…

make/Makefile【Linux系统编程】

一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的规则来指定&#xff0c;哪些文件需要先编译&#xff0c;哪些文件需要后编译&#xff0c;哪些文件需要重新编译&#xff0c;甚至于进行更复杂的功能操作 makef…

哈希的应用(2)——布隆过滤器

布隆过滤器的提出 目录 布隆过滤器的提出 布隆过滤器概念 布隆过滤器的插入 ​编辑 布隆过滤器的查找&#xff08;保证可能存在&#xff0c;一定不存在&#xff09; 布隆过滤器的删除 布隆过滤器的优点 布隆过滤器的缺点 布隆过滤器的使用场景 布隆过滤器&哈希切…

基础算法之搜素(bfs和dfs模板和例题)

目录 一、深度优先搜索与回溯1、四阶数独2、排列类问题3、红与黑&#xff08;dfs或bfs和Flood fill&#xff09; 之前学习了暴力枚举策略&#xff0c;将所有可能的情况都枚举一遍以获得最优解&#xff0c;但是枚举全部元素的效率如同愚公移山&#xff0c;无法应付数据范围稍大的…

【LLM】Langchain使用[三](基于文档的问答)

文章目录 一、基于文档的问答1. 创建向量存储2. 不同类型的chain链 二、本地知识库问答Reference 一、基于文档的问答 1. 创建向量存储 使用Dock Array内存搜索向量存储&#xff0c;作为一个内存向量存储&#xff0c;不需要连接外部数据库创建向量存储&#xff1a;导入一个索…

复习第七课 C语言-指针数组,函数,string

目录 【1】指针和数组 【2】数组指针 【3】指针数组 【4】函数 【5】函数传参 【6】动态开辟堆区空间 【7】string函数族 【8】递归函数 练习&#xff1a; 【1】指针和数组 直接访问&#xff1a;通过数组名访问 间接访问&#xff1a;通过指针访问 》1. 一维数组 in…

动态规划之118杨辉三角(第6道)

题目&#xff1a;给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 题目链接&#xff1a;118. 杨辉三角 - 力扣&#xff08;LeetCode&#xff09; 示例&#xff1a; 解法&#xff1…

【iOS】内存管理五大区

参考博客&#xff1a;iOS内存管理学习第一篇-内存五大区 3.1 OC特性之 内存五大区域 1. 简述 程序要想执行&#xff0c;第一步就需要 被加载到内存中 内存五大区域: 栈区,堆区,BSS段(静态区),常量区(数据段),代码段. 栈区&#xff08;stack&#xff09;由编译器自动分配并释放…

手写Spring框架---MVC实现

目录 预备 自研框架MVC的实现 MVC架构草图&#xff1a; 大致流程 实现思路 自定义注解 JavaBean 请求的拦截-建立DispatcherServlet 责任链处理请求 RequestProcessor矩阵 Render矩阵 预备 在DispatcherServlet&#xff1a; 解析请求路径和请求方法依赖容器&#xf…