问:有一种Java语法叫注解,一起来扒一扒~

news/2024/9/18 8:08:03/ 标签: java, 开发语言

在Java编程语言中,注解(Annotation)和元注解(Meta-Annotation)为开发者提供了丰富的机制来嵌入元数据,从而增强代码的可读性、可维护性,并允许编译器或运行时环境进行特定的处理。

一、注解(Annotation)概述

注解是Java 5(JDK 1.5)引入的一种特性,它允许开发者在代码中嵌入元数据,而不会直接影响程序的执行。注解以@符号开头,后跟注解的名称。注解可以应用于类、方法、字段、参数等代码元素,为它们提供额外的信息或控制。

作用

  • 生成文档:通过注解生成的元数据,可以生成javadoc文档。
  • 编译检查:编译器可以根据注解进行编译期间的检查验证。
  • 编译时和运行时动态处理:注解允许在编译时或运行时动态地处理元数据,例如动态生成代码或使用反射注入实例。

使用场景
注解广泛应用于框架开发、代码分析、测试、依赖注入等领域,为代码提供额外的辅助信息和行为控制。

二、元注解(Meta-Annotation)详解

元注解是自定义注解的注解,用于对其它注解进行说明。Java 5定义了四种标准元注解:@Documented@Target@Retention@Inherited

1. @Target

作用:指明注解可以应用的Java元素类型。

说明@Target注解确定了注解可以被用于哪些对象,包括包、类型(类、接口、枚举、注解类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量。

代码示例

java">import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD) // 指明该注解只能应用于方法
@Retention(RetentionPolicy.RUNTIME)
public @interface MyMethodAnnotation {// 注解的属性定义
}
2. @Retention

作用:定义注解的存活时间,即注解在什么阶段有效。

取值

  • SOURCE:仅在源文件中有效,编译时会被忽略。
  • CLASS:在编译后的class文件中有效,但在运行时不可访问。
  • RUNTIME:在运行时有效,可以通过反射获取注解信息。

代码示例

java">import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME) // 指明该注解在运行时有效
public @interface MyRuntimeAnnotation {// 注解的属性定义
}
3. @Documented

作用:指示注解应该被javadoc或类似的工具文档化。

说明:当一个注解被@Documented注解标记时,它会被视为被标注程序成员的公共API的一部分,因此应该包含在生成的文档中。

代码示例

java">import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;@Documented // 指明该注解应该被文档化
@Retention(RetentionPolicy.RUNTIME)
public @interface MyDocumentedAnnotation {// 注解的属性定义
}
4. @Inherited

作用:标记注解在类继承时是否会被自动继承。

说明:如果一个注解类型被@Inherited注解修饰,并且被应用于一个类,那么这个注解也会自动被应用于该类的所有子类。

代码示例

java">import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;@Inherited // 指明该注解在类继承时会被自动继承
@Retention(RetentionPolicy.RUNTIME)
public @interface MyInheritedAnnotation {// 注解的属性定义
}@MyInheritedAnnotation // 应用于父类
public class ParentClass {// 父类的代码
}public class ChildClass extends ParentClass {// 子类自动继承了MyInheritedAnnotation注解
}
三、注解与元注解的区别
维度注解元注解
定义与作用对代码进行标记和说明的机制,用于为代码元素添加额外的元数据对注解进行说明的注解,用于为注解提供额外的描述和约束
使用场景直接应用于代码元素,为它们提供额外的信息或控制应用于注解定义本身,为注解提供额外的元数据描述和约束条件
目的与意义为代码元素提供额外的元数据,增强代码的可读性和可维护性为注解提供额外的描述和约束条件,确保注解的正确使用和理解
存在形式可以在代码中独立存在,对代码元素进行标记必须依附于注解存在,对注解进行进一步说明
功能作用可以提供关于代码元素的描述、约束、配置等信息主要用于定义注解的行为、属性、使用范围等
使用方式通常在代码元素(如类、方法、变量等)上使用在定义注解时使用,用于注解的元数据描述

通过对比,可以清晰地看到注解与元注解在定义与作用、使用场景、目的与意义、存在形式、功能作用以及使用方式等多个维度上的区别。这些区别使得注解和元注解在Java编程中各自扮演着不同的角色,共同为代码的标记、说明和元数据描述提供支持。

综上所述,Java中的注解和元注解为开发者提供了强大的机制来嵌入元数据和控制代码行为。通过合理地使用注解和元注解,开发者可以编写出更加清晰、简洁和可维护的代码。


http://www.ppmy.cn/news/1524786.html

相关文章

大型语言模型:通过代码生成、调试和 CI/CD 集成改变软件开发的游戏规则

借助 AI,软件开发领域正在经历一个突破性阶段,不断集成最先进的大型语言模型,如 GPT-4 和 Claude Opus。这些模型超越了传统开发人员工具的作用,直接帮助开发人员将口头指令转换为跨各种编程语言的可执行代码,从而加快…

深度学习的零碎知识点

显卡内存 什么是显卡内存 简单来说就是,Windows 会在物理显存/「专用 GPU 内存」不够用或只有集成显卡的情况下,将物理内存 RAM 当作 GPU 的虚拟显存/「共享 GPU 内存」来使用。 什么是 Windows「共享 GPU 内存」,它与 VRAM 有什么不同 (s…

【学习笔记】SSL密码套件之哈希

本篇将介绍TLS/SSL密码套件中常用的哈希算法,包括Poly1305、SHA384、SHA256、SHA、MD5 以上的哈希算法将作为 MAC 使用 MAC - Message Authentication Code 为批量数据提供了完整性(Integrity)以及真实性(Authentication&#xf…

yolo学习 (一) 安装yolov8及训练

随便搞个python环境,直接装或者anaconda都行,python版本最低3.8以上 一、安装yolov8 (cpu版本) pip install ultralytics yolov8安装版本比较省事,不过这里默认装的是CPU版本 import torch print(torch.__version_…

前端 + 接口请求实现 vue 动态路由

前端 接口请求实现 vue 动态路由 在 Vue 应用中,通过前端结合后端接口请求来实现动态路由是一种常见且有效的权限控制方案。这种方法允许前端根据用户的角色和权限,动态生成和加载路由,而不是在应用启动时就固定所有的路由配置。 实现原理…

【springboot】整合spring security 和 JWT

目录 1. 整合spring security 1. 导入依赖 2. 配置类 3. 实体类实现UserDetails接口 4. 业务逻辑实现类实现UserDetailsService接口 5. 控制类实现登录功能 6. 测试登录功能 2. 分析源码 1. UsernamePasswordAuthenticationToken 2. A…

windows JOB作业类的处理

windows JOB作业类的处理 windows JOB作业类的处理 文章目录 windows JOB作业类的处理 # windows JOB作业类的处理 /* moduel Job.h Notices: */#pragma once #include <malloc.h> //for _alloca; class CJob { private:HANDLE m_hJob; public:CJob(HANDLE hJob NULL);…

论文翻译:USENIX-2021 Extracting Training Data from Large Language Models

Extracting Training Data from Large Language Models 从大型语言模型中提取训练数据 https://www.usenix.org/system/files/sec21-carlini-extracting.pdf 文章目录 从大型语言模型中提取训练数据摘要1 引言 摘要 现在&#xff0c;发布在私有数据集上训练的大型&#xff…

828华为云征文|基于华为云Flexus云服务器X部署Minio服务

文章目录 ❀前言❀Minio简介❀部署环境准备❀yum环境配置❀安装docker❀获取镜像❀创建挂载目录❀启动容器❀查看容器状态❀安全组开放❀浏览器访问❀总结 ❀前言 大家好&#xff0c;我是早九晚十二。 近期华为云推出了最新的华为云Flexus云服务器X&#xff0c;这款云主机在算…

windows 显示进程地址空间

windows 显示进程地址空间 windows 显示进程地址空间 文章目录 windows 显示进程地址空间显示进程地址空间 显示进程地址空间 /* 3-ProcessInfo.cpp 显示进程地址空间 */#include "..\\CommonFiles\\CmnHdr.h" #include "..\\CommonFiles\\Toolhelp.h"#i…

Debian命令行设置samba共享目录

Samba 是一个用于在 Unix/Linux 系统上实现 SMB/CIFS 网络协议的软件套件,使这些系统能够与 Windows 网络共享文件和打印机。在 Debian 10 上安装和配置 Samba 可以实现 Linux 和 Windows 之间的无缝文件共享。 安装 Samba 1. 更新包列表并安装 Samba: sudo apt update sud…

dplyr、tidyverse和ggplot2初探

dplyr、tidyverse 和 ggplot2 之间有紧密的联系&#xff0c;它们都是 R 语言中用于数据处理和可视化的工具&#xff0c;且都源于 Hadley Wickham 的工作。它们各自有不同的功能&#xff0c;但可以无缝协作&#xff0c;帮助用户完成从数据处理到数据可视化的工作流。以下是它们之…

Kubernetes 系列 | k8s入门运维

目录 一、K8S集群搭建1.1 部署方式1.2 了解kubeadm1.3 部署流程1.3.1 初始化配置1.3.2 安装容器运行时1.3.3 安装K8S软件包1.3.4 创建集群 二、集群高可用1.1 集群高可用-堆叠1.2 集群高可用-集群外etcd 三、Pod运维3.1 Pod运维3.2 Pod的生命周期3.3 Pod状况3.4 Pod阶段3.5 容器…

java的BigInteget介绍

当java程序需要处理一个非常大的整数&#xff0c;超过long类型的取值范围&#xff0c;就无法用基本类型对数值接收&#xff0c;这样就要用到BigInteget类。 BigInteger类的方法 BigInteger(String val) 将字符串变为BigInteger类型数据 示例代码如下 import java.math.BigI…

Linux 驱动编写框架 并编译导入开发板

向内核新加文件&#xff1a;例如 demo1.c 1. 创建并编辑新的文件 #include <linux/init.h> #include <linux/kernel.h> #include <linux/types.h> #include <linux/fs.h> #include <linux/module.h> #include <linux/kdev_t.h> #include …

大数据之Spark(一)

九、Spark&#xff08;PySpark 3.2&#xff09; 9.1、基本概念 定义&#xff1a;用于大规模数据处理的统一分析引擎 运行模式 本地模式&#xff08;单机&#xff09;&#xff1a;一个独立进程&#xff0c;多个线程模拟spark运行时环境Standalone模式&#xff08;集群&#…

【数据库-CRUD进阶-约束,联合查询,内连接(详解)】

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a; c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 &#x1f412…

​招​银​网​络​​大​疆​​元​象​一​面​

1. 请尽可能详细地说明&#xff0c;XHR、axios和fetch这三者的区别是什么&#xff1f;axios和fetch的底层实现是什么&#xff1f;axios拦截器是什么&#xff1f;axios提供了哪些配置或功能&#xff0c;是fetch和XHR中没有的&#xff1f;你的回答中不要写出示例代码。 XHR、axi…

flink中startNewChain() 的详解

在 Apache Flink 中&#xff0c;startNewChain() 是一个与算子链&#xff08;operator chaining&#xff09;相关的方法。与 disableChaining() 类似&#xff0c;它允许开发者控制算子链的创建方式&#xff0c;但 startNewChain() 的作用是从当前算子开始创建一个新的算子链&am…

全面解析性能测试中的瓶颈分析与优化策略!

在软件开发的生命周期中&#xff0c;性能测试是确保应用程序在不同负载下稳定运行的关键步骤。性能瓶颈是导致系统性能下降的主要原因&#xff0c;及时发现并解决这些瓶颈&#xff0c;能够显著提升系统的响应速度和用户体验。本文将深入探讨性能测试中的瓶颈分析方法与优化策略…