Java 注解概述和自定义注解案例

文章目录

    • 一、注解概述
      • 1.1 什么是注解
      • 1.2 注解的用途
      • 1.3 注解的常见种类
      • 1.4 注解类型和常用注解
    • 二、自定义注解
      • 2.1 自定义注解的格式
      • 2.2 自定义注解中的属性
      • 2.3 自定义注解的案例
    • 参考资料

一、注解概述

1.1 什么是注解

注解是元数据的一种形式,它提供的数据不是程序本身的一部分。

注解对它们注释的代码的操作没有直接影响。举个简单的例子,系统上有一个 sm.png 文件,这个文件才是我们真正需要的数据本身,而这个文件的属性则可以称之为 sm.png 的元数据,是用来描述 png 文件的创建时间、修改时间、分辨率等信息的,这些信息无论是有还是没有都不影响它作为图片的性质,都可以使用图片软件打开。

注解的生效依赖于它们被解析的方式,常见的解析方法有两种:

  • 编译期直接扫描:编译器在编译 Java 代码时会扫描对应的注解并进行相应处理。
  • 运行期通过反射处理:许多框架利用反射机制在运行时对注解进行解析和处理。

1.2 注解的用途

注解有多种用途,其中包括:

(1)编译器信息

一些注解会被编译器在编译时处理:

  • 错误检测:注解可以帮助编译器在编译时检测代码中的错误。例如,@Override 注解可以检查方法是否正确地覆盖了父类的方法。

  • 警告抑制:通过使用注解(如 @SuppressWarnings),可以抑制编译器的特定警告。

(2)编译时和部署时处理

工具可以在编译时或部署时处理注解。

  • 代码生成:一些框架和工具(如 Lombok)可以在编译时处理注解,根据注解生成额外的代码,如构造函数、gettersetter 方法。

  • 配置生成:注解可以用于生成配置文件(如XML、JSON)。这些配置文件在部署时可以用于配置应用程序的各种参数。

(3) 运行时处理

注解可以在运行时通过反射机制进行处理。

  • 依赖注入:许多依赖注入框架(如 Spring 和 Guice)使用注解(如 @Autowired)来标记和注入依赖。

  • 事务管理:在数据库操作中,注解(如 @Transactional)声明事务的边界,以自动管理事务的开始和结束。

  • 日志记录:使用自定义注解可以在运行时动态地添加日志记录逻辑,减少手动编写日志代码的繁琐。

由于注解的便利性,许多框架和库都提供了相应的注解支持,以简化开发并增强功能。

1.3 注解的常见种类

注解主要分为以下三种类型:

  • 元注解: java内置的注解,标明该注解的使用范围、生命周期等。
  • 标准注解 :Java提供的基础注解,标明过期的元素/标明是复写父类方法的方法/标明抑制警告。
  • 自定义注解: 第三方定义的注解,含义和功能由第三方来定义和实现。

1.4 注解类型和常用注解

注解主要分为以下三种类型:

  • 元注解:Java 内置的注解,标明该注解的使用范围、生命周期等。具体细节查看 Annotations - Dev.java
  • 标准注解:Java 提供的基础注解,标明过期的元素/标明是复写父类方法的方法/标明抑制警告。
  • 自定义注解:第三方定义的注解,含义和功能由第三方来定义和实现。
注解类型描述
元注解
@Retention标明注解的保留策略,定义在什么级别保存注解信息
@Target标明注解的使用目标(如类、方法、字段等)
@Documented标明注解会包含在 Javadoc 中
@Inherited标明注解可继承
标准注解
@Override标明此方法覆盖了父类的方法
@Deprecated标明此元素已过时,不建议使用
@SuppressWarnings抑制编译器产生的警告信息
自定义注解
@Controller用于标明 Spring MVC 控制器类
@Autowired用于标明 Spring 自动注入字段或方法参数
@GetMapping用于标明 Spring MVC 控制器的方法 GET 请求映射路径
@PostMapping用于标明 Spring MVC 控制器的方法 POST 请求映射路径

二、自定义注解

2.1 自定义注解的格式

自定义注解可以通过 @interface 关键字来定义。

public @interface AnnotationName {// 定义注解的元素(可以看作注解的属性)ElementType elementName();ElementType2 elementName2() default defaultValue;
}

另外,在自定义注解时,我们可以使用 元注解 标明该注解的使用范围、生命周期等。

注解的本质是接口,注解内部的属性是带默认值的方法

2.2 自定义注解中的属性

在 Java 中,注解(Annotation)是一种元数据,提供了一种安全且可移植的方式来将信息关联到程序元素(如类、方法、变量等)。由于注解本质上是编译器处理的特殊标记,不能像普通类那样直接定义属性。为了模拟属性的效果并允许设置默认值,Java 采用方法的形式来声明和访问注解的属性。

例如,定义一个注解时可以使用 key() default ""; 的形式,这样在使用该注解时,可以像操作属性一样为 key 赋值,例如 @MyAnnotation(key = "value")。这种方法不仅便于编译器解析和处理注解的属性值,还使得代码更加简洁和易于理解。

2.3 自定义注解的案例

(1) 定义注解

@Retention(RetentionPolicy.RUNTIME)  // 定义注解的保留策略
@Target(ElementType.METHOD)          // 定义注解的目标
public @interface MyAnnotation {// 定义注解的元素(属性)String value();                  // 必需元素int number() default 0;          // 有默认值的元素String description() default ""; // 有默认值的元素
}

(2)使用注解

public class AnnotationExample {/*** 使用自定义注解*/@MyAnnotation(value = "Test", number = 5, description = "This is a test method")public void testMethod() {// 方法实现}
}

以上示例展示了如何在方法上使用自定义注解,并为注解的属性传递了相应的值。在实际开发中,我们可以根据需要定义不同的自定义注解,并在代码中使用它们来实现特定的逻辑。

(3)通过反射在运行时获取注解信息

public static void main(String[] args) throws NoSuchMethodException {Method method = AnnotationExample.class.getMethod("testMethod");MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);if (annotation != null) {System.out.println("value: " + annotation.value());System.out.println("number: " + annotation.number());System.out.println("description: " + annotation.description());}
}

参考资料

Annotations - Dev.java

Java基础常见面试题总结(下) | JavaGuide

Java注解入门到精通,这一篇就够了_java 注解-CSDN博客

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

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

相关文章

Android 里SQLite和ROOM框架简单介绍

简单的Android SQLite使用 最简单的SQLite 在 Android 开发中,SQLite是一个轻量级的关系型数据库管理系统,经常用于存储和管理应用程序的数据。如果你刚刚学习Android数据库的使用,你一定要学习SQLite的使用。以下是一个简单的示例&#xf…

优化算法|自适应大邻域搜索算法及MATLAB代码实现

回来填坑了,本篇推文将详细讲解ALNS算法求解VRP问题及MATLAB代码实现。 算法介绍 节约算法构造初始解 function routessaving_init(DistMatrix, Demand, Cap) C_EPS1e-1;Nsize(DistMatrix,1); routescell(numel(2:N),1); for i1:numel(routes) % 每个节点单独一条…

Javascript面试基础6【每日更新10】

Gulp gulp是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器;它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成 Gulp的核心概念:流 流,简单来说就是建立在面向对象基础上的一种抽象的…

【Django】前端技术HTML常用标签(开发环境vscode)

文章目录 安装两个常用插件HTML常用标签定义文档类型DOCTYPE网页的结构html/head//title/body/div标题h1/h2/h3/h4/h5分割线hr段落 p列表ul/li,ol/li超链接a文本span图片img按钮button表格table(table、tr、th、td)表单form 安装两个常用插件…

基于riscv64架构的Dayu800开发板的napi_demo开发介绍

itopen组织1、提供OpenHarmony优雅实用的小工具2、手把手适配riscv qemu linux的三方库移植3、未来计划riscv qemu ohos的三方库移植 小程序开发4、一切拥抱开源,拥抱国产化 一、环境准备工作 1.1 Ubuntu20.04环境配置 如果已经配置OpenHarmony的编译环境则…

目标检测 YOLOv5-7.0 详细调试自制数据集实战

目标检测 YOLOv5-7.0 详细调试&自制数据集实战 一、项目介绍及环境配置(一)项目解读(二)版本选择(三)环境配置 二、如何利用YOLOv5进行预测(detect.py)(一&#xff0…

Windows 实用小工具:窗口钉子/文件管理 2024/7/27

一: wintop 窗口置顶工具 二:WinDirStat 这是一个免费的、开源的磁盘使用分析工具,适用于Windows系统。它会扫描你的硬盘,列出所有文件和文件夹的大小,并以图形化的方式展示,便于理解。 可以用来检测硬盘文件夹占用从而,酌情处…

【C#】获取DICOM图像像素的像素值

8位像素深度的像素值 public byte GetGreyValue(int x, int y) {x Math.Min(x, m_nWidth - 1);y Math.Min(y, m_nHeight - 1);unsafe{byte* greyValue (byte*)m_pDicomData.ToPointer() y * m_nWidth x;return *greyValue;} } 16位像素深度的像素值 public ushort GetG…

JAVA.抽象、接口、内部类

1.抽象 共性,父类定义抽象方法,子类必须重写,或者子类也是抽象类 示例代码 animal package animalabstract;//定义抽象类animal public abstract class animal {String name;int age;//定义抽象方法eat,子类必须重写public abs…

Java给定一些元素随机从中选择一个

文章目录 代码实现java.util.Random类实现随机取数(推荐)java.util.Collections实现(推荐)Java 8 Stream流实现(不推荐) 完整代码参考(含测试数据) 在Java中,要从给定的数据集合中随机选择一个元素,我们很容易想到可以使用 java.…

Redis快速入门(一)

一、初识Redis 1、认识NoSQL NoSql可以翻译做Not Only Sql(不仅仅是SQL),或者是No Sql(非Sql的)数据库。是相对于传统关系型数据库而言,有很大差异的一种特殊的数据库,因此也称之为非关系型数据库。   a)结构化与非结构化   传统关系型数据库是结构化数据,每一张…

【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件

目录 ​编辑 前言 系统调用 open 参数flags 参数mode write 追加方式 read close 文件描述符 打开多个文件并观察其文件描述符 C语言文件操作 理解一切皆文件 理解open操作 前言 各类语言的文件操作其实是对系统调用的封装 我们经常说,创建一个文件&a…

力扣第三十七题——解数独

内容介绍 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数独…

每天一个数据分析题(四百四十四)- 数据仓库

企业数据仓库里面的数据一般是由业务数据经过ETL技术处理后来的,以下关于ETL的说法错误的是 A. ETL过程中的主要环节是数据抽取、数据转换和加工、数据流转 B. 增量数据抽取过程中,提取增量数据的方法有通过时间戳、建立触发器、全表比对、日志比对等 …

springboot整合pgsql

demo代码说明 springboot使用mybatis-plus整合pgsql 在springboot项目中使用pgsql,使用了mybatis-plus、druid 代码见 spring-demo: springboot 结合各种插件 demo 注意事项: 版本兼容 正常springboot使用,但是注意需要添加pgsql正确版…

CVE-2024-39700 (CVSS 9.9):JupyterLab 模板中存在严重漏洞

在广泛使用的 JupyterLab 扩展模板中发现了一个严重漏洞,编号为CVE-2024-39700 。此漏洞可能使攻击者能够在受影响的系统上远程执行代码,从而可能导致大范围入侵和数据泄露。 该漏洞源于在扩展创建过程中选择“测试”选项时自动生成“update-integratio…

VIM基础配置

1. CTAGS配置 下载 上传虚拟机,解压,进入目录 tar -xzvf ctags-5.8.tar.gz cd ctags-5.8/编译 ./configure sudo make sudo make install查看是否安装成功 ctags --version打印如下 2. 使用Vundle 下载 git clone https://github.com/VundleVim/Vund…

Linux并发程序设计(3):守护进程

目录 前言 一、介绍 1.1 概念 1.2 特点 1.3 举例 二、系统编程 2.1 setsid函数 2.2 getpid函数 2.3 getsid函数 2.4 getpgid函数 2.5 chdir函数 三、代码例程 3.1 使子进程在后台运行 3.2 使子进程脱离原终端 3.3 更换目录,并设定权限(非…

React--Redux

Redux 是一个用于 JavaScript 应用的状态管理库,特别是在 React 应用中非常流行。下面我将详细介绍一个使用 Redux 的简单案例,包括设置 Redux 环境、创建 store、定义 actions 和 reducers,以及如何连接 React 组件。 步骤 1: 安装依赖 首…