【Java注解】

Java注解(Annotation)让其他程序根据注解信息来决定怎么执行该程序。

是Java 5中引入的一种特殊类型的注释,它可以被用来为代码添加元数据,即关于代码的数据。

注解不会改变程序的逻辑,但它们可以被其他程序使用,比如编译器、开发工具或其他可以在运行时分析注解的代码。

注解的定义

注解通过 @interface 关键字来定义。下面是一个简单的注解定义:

public @interface SimpleAnnotation {// 定义注解的属性(元素)public 属性类型 属性名() default 默认值;
}

注解元素的类型可以是基本类型、String、枚举、注解类型或这些类型的数组。

为什么要使用注解

使用注解可以:

  1. 提供信息给编译器:例如,@Override注解告诉编译器某个方法是重写了父类中的方法。
  2. 为运行时处理提供信息:例如,通过反射机制读取注解信息,然后根据这些信息执行特定的逻辑。
  3. 减少配置文件的使用:传统的配置方式可能需要大量的XML或属性文件,而注解可以在代码中直接提供配置信息。

自定义注解

注解可以用来修饰包、类、接口、方法、字段、构造器、局部变量等。

定义自定义注解 

格式:

public @interface 注解名称{public 属性类型 属性名() default 默认值;
}

例子:

public @interface MyAnnotation {  // 定义了一个名为value的元素,它是String类型,有默认值"Hello"  String value() default "Hello";  // 定义了一个名为id的元素,它是int类型,没有默认值  int id();  
}

使用自定义注解

使用自定义注解非常简单,只需要在需要的地方(如类、方法、字段等)前面加上@符号和注解名,并为其元素指定值(如果有需要的话)。

@MyAnnotation(value = "World", id = 123)  
public class MyClass {  @MyAnnotation(id = 456) // 注意这里省略了value,因为它有默认值  public void myMethod() {  // 方法体  }  
}

特殊属性名:value

单一值注解:当注解只包含一个名为value的元素时,在使用注解时可以省略属性名和等号。这意味着你可以直接在括号内提供值。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SimpleAnnotation {String value(); // 唯一的属性名为value
}

注解的原理 

本质

特殊类型的接口

  • 定义方式:注解使用@interface关键字来定义,这看起来类似于接口的定义,但实际上它们是一种特殊的接口,专门用于提供元数据。
  • 无实现方法:注解中定义的方法(称为元素)都是无参数的,并且这些方法实际上并不包含实现代码,它们只是用于声明注解的属性。

元数据

  • 作用:注解提供了一种形式化的方法来描述类、方法、变量等构成成分的额外信息,这些信息被称为元数据。
  • 用途:元数据可以用于多种目的,如生成文档、编译检查、代码分析等。

元注解

  • 定义注解的注解:元注解用于控制注解的行为,如指定注解可以应用的Java元素类型(@Target)、注解的保留策略(@Retention)、是否将注解包含在Javadoc中(@Documented)以及是否允许子类继承父类中的注解(@Inherited)。

注解解析 

这里我将通过一个简单的例子来说明如何在运行时通过反射读取注解信息。

首先,定义一个注解:

import java.lang.annotation.ElementType;  
import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;  
import java.lang.annotation.Target;  @Retention(RetentionPolicy.RUNTIME) // 注解保留在运行时,以便可以通过反射读取  
@Target({ElementType.METHOD}) // 注解可以应用于方法上  
public @interface MyAnnotation {  String value() default "default value"; // 注解有一个名为value的元素,带有默认值  
}

 然后,创建一个使用该注解的类:

public class MyClass {  @MyAnnotation(value = "Hello, World!")  public void myMethod() {  // 方法体  }  
}

最后,通过反射来解析注解:

import java.lang.reflect.Method;  public class AnnotationReader {  public static void main(String[] args) throws NoSuchMethodException {  // 获取MyClass类的Class对象  Class<?> clazz = MyClass.class;  // 获取名为"myMethod"的方法  Method method = clazz.getDeclaredMethod("myMethod");  // 检查该方法是否被MyAnnotation注解  if (method.isAnnotationPresent(MyAnnotation.class)) {  // 获取注解实例  MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);  // 读取注解中的value值  System.out.println(annotation.value()); // 输出: Hello, World!  }  }  
}

在上面的例子中,我们首先定义了一个名为MyAnnotation的注解,它有一个名为value的元素,并默认值为"default value"。然后,我们在MyClass类的一个方法myMethod上使用了这个注解,并指定了value的值为"Hello, World!"。最后,我们通过反射机制在AnnotationReader类中获取了MyClass类的myMethod方法,并检查了该方法是否被MyAnnotation注解。如果该方法被注解,我们就获取注解的实例,并读取了value的值。

这个例子展示了如何在运行时通过反射来解析和处理注解信息。当然,注解的应用远不止于此,它们可以用于生成代码、编译时检查、测试等多种场景。

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

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

相关文章

Datawhale X 南瓜书 task02学习笔记

算法原理引入 样本点通常应该在模型的2侧&#xff0c;原因&#xff1a;在实际中&#xff0c;因为某种不可控的因素&#xff0c;测出来的样本点肯定是有误差的。如果样本数据点都在模型上&#xff0c;则说明在建立模型时&#xff0c;把误差也考虑进去了&#xff0c;这就是我们说…

【技术解析】消息中间件MQ:从原理到RabbitMQ实战(深入浅出)

文章目录 【技术解析】消息中间件MQ&#xff1a;从原理到RabbitMQ实战(深入浅出)1.简介1.1 什么是消息中间件1.2 传统的http请求存在那些缺点1.3 Mq应用场景有那些1.4 为什么需要使用mq1.5 Mq与多线程之间区别1.6 Mq消息中间件名词1.7主流mq区别对比1.8 Mq设计基础知识 2.Rabbi…

前端框架Vue、React、Angular、Svelte对比

在对比 React、Vue.js、Angular 和 Svelte 时&#xff0c;除了在高层次的特性上有显著差异&#xff0c;它们在核心设计理念和底层实现机制上也有明显的不同。为了清晰地理解这些框架&#xff0c;我们可以从以下几个方面来分析它们的核心不同点和底层不同点。 1. 框架类型和设计…

Golang | Leetcode Golang题解之第415题字符串相加

题目&#xff1a; 题解&#xff1a; func addStrings(num1 string, num2 string) string {add : 0ans : ""for i, j : len(num1) - 1, len(num2) - 1; i > 0 || j > 0 || add ! 0; i, j i - 1, j - 1 {var x, y intif i > 0 {x int(num1[i] - 0)}if j &g…

【Unity链接数据库01】Unity使用Oracle 数据库完成登录注册功能

业务需求&#xff1a; 我现在需要在Unity 中创建一个登录功能我有以下业务需求&#xff1a; 1.用户可以注册账号密码 2.用户可以登录 3.使用Oracle 数据库表存储 4.我有一个服务器 地址已经安装了oracle 数据库 5.创建一个数据库用户 &#xff0c;账号密码 为Unity/ Unity …

Oracle 数据库常用命令与操作指南

Oracle 数据库是企业级系统中常用的数据库管理系统&#xff0c;掌握基础的命令可以让你在日常管理中更加高效。本指南将介绍几条常用的 Oracle 数据库命令&#xff0c;涵盖用户权限管理、修改用户密码、删除用户、以及其他日常操作。 目录 授权用户操作权限使用最高权限登录 O…

Spark SQL性能优化高频面试题及答案

目录 高频面试题及答案1. 如何通过分区(Partitioning)优化Spark SQL查询性能?2. 什么是数据倾斜(Data Skew)?如何优化?3. 如何使用广播(Broadcast)优化Join操作?4. 如何优化Spark SQL的Shuffle操作?5. 如何通过缓存(Cache)优化Spark SQL的性能?6. 如何使用合适的…

ChatGPT 4o 使用指南 (9月更新)

首先基础知识还是要介绍得~ 一、模型知识&#xff1a; GPT-4o&#xff1a;最新的版本模型&#xff0c;支持视觉等多模态&#xff0c;OpenAI 文档中已经更新了 GPT-4o 的介绍&#xff1a;128k 上下文&#xff0c;训练截止 2023 年 10 月&#xff08;作为对比&#xff0c;GPT-4…

深度学习自编码器 - 去噪自编码器篇

序言 在深度学习的广阔天地中&#xff0c;自编码器作为一种强大的无监督学习工具&#xff0c;通过重构输入数据的方式&#xff0c;不仅实现了数据的有效压缩&#xff0c;还探索了数据的内在表示。而去噪自编码器&#xff08; Denoising Autoencoder, DAE \text{Denoising Auto…

软件设计师——操作系统

&#x1f4d4;个人主页&#x1f4da;&#xff1a;秋邱-CSDN博客☀️专属专栏✨&#xff1a;软考——软件设计师&#x1f3c5;往期回顾&#x1f3c6;&#xff1a;C: 类和对象&#xff08;上&#xff09;&#x1f31f;其他专栏&#x1f31f;&#xff1a;C语言_秋邱 一、操作系统…

mxnet 的显存分配机制

mxnet 的显存分配机制 MXNet 的显存分配机制在性能优化和资源管理方面起着至关重要的作用。它通过高效的内存管理和调度机制来分配和释放显存&#xff0c;确保在训练深度学习模型时最大限度地利用 GPU 的资源。MXNet 的显存分配机制类似于其他深度学习框架&#xff08;如 PyTo…

VGG16模型实现新冠肺炎图片多分类

1. 项目简介 本项目的目标是通过深度学习模型VGG16&#xff0c;实现对新冠肺炎图像的多分类任务&#xff0c;以帮助医疗人员对患者的影像进行快速、准确的诊断。新冠肺炎自爆发以来&#xff0c;利用医学影像如X光和CT扫描进行疾病诊断已成为重要手段之一。随着数据量的增加&am…

华为---以太网静态路由配置使用下一跳通信正常,而使用出接口无法通信

目录 1. 实验环境 2. 结果测试 3. 分析验证 3.1 以太网静态路由配置使用下一跳跨网段通信抓包分析 3.2 以太网静态路由配置使用出接口跨网段通信抓包分析 3.3 以太网静态路由配置使用出接口无法跨网段通信问题解决办法 1. 实验环境 以太网静态路由配置使用下一跳跨网段通…

网络丢包定位记录(二)

网卡驱动丢包 查看&#xff1a;ifconfig eth1/eth0 等接口 1.RX errors: 表示总的收包的错误数量&#xff0c;还包括too-long-frames错误&#xff0c;Ring Buffer 溢出错误&#xff0c;crc 校验错误&#xff0c;帧同步错误&#xff0c;fifo overruns 以及 missed pkg 等等。 …

Maven的详细解读和配置

目录 一、Maven 1.1 引言 1.2 介绍 1.3 下载安装 1.3.1 解压 1.3.2 配置环境变量 1.3.3 测试 1.4 仓库[了解] 1.5 Maven配置 1.5.1 修改仓库位置 1.5.2 设置镜像 二、IDEA - MAVEN 2.1 idea关联maven 2.2 为新项目设置 2.2 创建java项目[重点] 2.3 java项目结构…

Go-知识-定时器

Go-知识-定时器 1. 介绍2. Timer使用场景2.1 设定超时时间2.2 延迟执行某个方法 3. Timer 对外接口3.1 创建定时器3.2 停止定时器3.3 重置定时器3.4 After3.5 AfterFunc 4. Timer 的实现原理4.1 Timer数据结构4.1.1 Timer4.1.2 runtimeTimer 4.2 Timer 实现原理4.2.1 创建Timer…

特征工程与交叉验证在机器学习中的应用

数据入口&#xff1a;学生考试表现影响因素数据集 - Heywhale.com 本数据集提供了关于影响学生考试成绩的多种因素的全面概述。数据集包含了有关学习习惯、出勤率、家长参与、资源获取等方面的信息。 数据说明 字段名说明Hours_Studied每周学习的小时数Attendance出勤率&…

Go语言的垃圾回收(GC)机制的迭代和优化历史

Go语言的垃圾回收&#xff08;GC&#xff09;机制自Go语言发布以来经历了多次重要的迭代和优化&#xff0c;以提高性能和减少程序运行时的停顿时间。 以下是一些关键的版本和相应的GC优化&#xff1a; Go版本GC耗时情况主要改进点Go 1.0-1.4可能达到几百毫秒至秒级使用简单的标…

《重生之我在java世界做任务升级》

ps:此乃我学习《Head First Java》之后的一本心得体会&#xff0c;现其分享给各位行走在Java道路上的道友 第一章&#xff1a;进入java的世界 尊敬的java玩家&#xff0c;欢迎来到JavaWorld&#xff0c;我将根据您的外貌特征为您创建游戏角色。 一眨眼&#xff0c;我仿佛进入了…

实时流处理框架(如Flink、Spark Streaming)

实时流处理框架&#xff08;如Flink、Spark Streaming&#xff09; 内部原理 Flink的核心概念&#xff1a; Checkpoint机制&#xff1a;Flink通过Checkpoint机制实现容错。Checkpoint会定期将系统的状态&#xff08;包括算子的状态&#xff09;持久化到外部存储&#xff08;如…