Java中的注解(Annotation)

news/2024/9/18 20:54:59/ 标签: java, 开发语言

        Java中的注解(Annotation)是一种用于在代码中添加元数据的机制。它们可以被用来为类、方法、变量、参数等元素添加额外的信息,这些信息在编译时或运行时可以被读取和使用。注解本身不会直接影响代码的执行,但可以通过反射等机制在运行时对代码进行处理。

注解的作用

  1. 编译检查:通过注解,编译器可以进行一些特定的检查,例如@Override注解可以确保方法是重写父类的方法。
  2. 代码生成:一些框架(如Spring)使用注解来生成额外的代码或配置文件。
  3. 运行时处理:通过反射机制,可以在运行时读取注解信息,从而进行一些动态处理。

常见的内置注解

  1. @Override:用于标识一个方法是重写父类的方法。
  2. @Deprecated:用于标识一个方法、类或字段已经过时,不建议使用。
  3. @SuppressWarnings:用于抑制编译器警告。

示例代码

1. @Override
java">public class Parent {public void doSomething() {System.out.println("Parent doing something");}
}public class Child extends Parent {@Override // 标识这个方法是重写父类的方法public void doSomething() {System.out.println("Child doing something");}
}
2. @Deprecated
java">public class MyClass {@Deprecated // 标识这个方法已经过时public void oldMethod() {System.out.println("This method is deprecated");}public void newMethod() {System.out.println("Use this method instead");}
}
3. @SuppressWarnings
java">public class SuppressWarningsExample {@SuppressWarnings("unchecked") // 抑制未检查的转换警告public void someMethod() {List list = new ArrayList();list.add("Hello"); // 这里会有未检查的转换警告}
}

自定义注解

        除了内置注解,Java还允许开发者自定义注解。自定义注解是通过@interface关键字来定义的。注解可以包含元素(类似于方法),这些元素可以有默认值。此外,自定义注解还可以使用元注解(如@Retention@Target)来指定注解的生命周期和作用目标。

示例:定义一个简单的自定义注解

示例:自定义注解

java">import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;@Retention(RetentionPolicy.RUNTIME) // 指定注解在运行时可用
@Target(ElementType.METHOD) // 指定注解只能用于方法
public @interface MyAnnotation {String value(); // 注解的元素,可以有默认值int count() default 1; // 带有默认值的元素
}

使用自定义注解

定义好注解后,可以在代码中使用它。使用注解时,需要为注解的元素提供值。

示例:在方法上使用自定义注解
java">public class UseMyAnnotation {@MyAnnotation(value = "This is a custom annotation", count = 5)public void annotatedMethod() {System.out.println("Method with custom annotation");}
}

处理自定义注解

        通过反射机制,可以在运行时读取和处理注解信息。反射允许我们在运行时检查类、方法、字段等元素上的注解。

java">import java.lang.reflect.Method;public class AnnotationProcessor {public static void main(String[] args) throws NoSuchMethodException {Method method = UseMyAnnotation.class.getMethod("annotatedMethod");if (method.isAnnotationPresent(MyAnnotation.class)) {MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);System.out.println("Annotation value: " + annotation.value());System.out.println("Annotation count: " + annotation.count());}}
}

详细步骤解析

  1. 定义注解

    • 使用@interface关键字定义注解。
    • 使用@Retention指定注解的生命周期(SOURCE、CLASS、RUNTIME)。
    • 使用@Target指定注解的作用目标(TYPE、METHOD、FIELD等)。
    • 定义注解的元素,可以有默认值。
  2. 使用注解

    • 在类、方法、字段等元素上使用注解。
    • 为注解的元素提供值。
  3. 处理注解

    • 使用反射机制在运行时读取注解信息。
    • 检查元素上是否存在特定注解。
    • 获取注解的元素值并进行相应处理。

通俗易懂的解释

  • 定义注解:就像创建一个特殊的标签(注解),这个标签可以包含一些信息(元素),并且可以告诉编译器和虚拟机这个标签什么时候有效(生命周期),以及可以贴在什么地方(作用目标)。
  • 使用注解:就像在代码上贴上这个特殊的标签,标签上的信息可以帮助编译器或程序员理解代码的意图。
  • 处理注解:就像在运行时检查这些标签,读取标签上的信息,并根据这些信息做出相应的动作。

     我们可以看到注解在Java中的多种用途和用法。注解不仅可以帮助开发者进行编译时检查,还可以在运行时提供额外的信息,从而实现更灵活和动态的代码处理。

注解(Annotation)和注释(Comment)

注解(Annotation)

  1. 定义:注解是一种用于在代码中添加元数据的机制。它们可以被用来为类、方法、变量、参数等元素添加额外的信息。
  2. 用途:注解本身不会直接影响代码的执行,但可以通过反射等机制在编译时或运行时对代码进行处理。注解常用于编译检查、代码生成、运行时处理等。
  3. 语法:注解使用@符号开头,例如@Override@Deprecated
  4. 生命周期:注解可以有不同的生命周期,包括源码级别(SOURCE)、编译时(CLASS)和运行时(RUNTIME)。

注释(Comment)

  1. 定义:注释是用于向代码中添加解释性文本的机制。它们用于帮助开发者理解代码的意图和逻辑。
  2. 用途:注释仅用于代码的可读性,不会被编译器或虚拟机处理。它们在编译时会被忽略。
  3. 语法:注释有多种形式,包括单行注释(//)、多行注释(/* ... */)和文档注释(/** ... */)。
  4. 生命周期:注释仅存在于源码中,编译后不会保留在字节码中。

示例对比

注解示例
java">@Override // 这是一个注解,用于标识方法重写
public void doSomething() {System.out.println("Child doing something");
}
注释示例
java">// 这是一个单行注释,用于解释代码的意图
public void doSomething() {/*这是一个多行注释,用于解释方法的详细逻辑*/System.out.println("Child doing something");
}

总结

  • 注解:用于添加元数据,可以通过反射等机制在编译时或运行时处理,不影响代码执行,但可以影响编译器的行为。
  • 注释:用于添加解释性文本,仅用于提高代码可读性,不会被编译器或虚拟机处理。

通过上述对比,我们可以清楚地看到注解和注释在Java中的区别和各自的作用。


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

相关文章

汽车三元浸出液回收钯铑

汽车三元催化器是减少汽车尾气排放的关键部件,它含有铂、钯、铑等贵金属。这些金属在汽车尾气净化过程中起着重要作用,但使用一段时间后会因中毒、烧结等原因而失活。回收这些贵金属不仅可以减少环境污染,还能节约宝贵的资源。以下是汽车三元…

使用C标准库中的printf输出

1、增加文件系统调用 对系统调用进行了调整,一是将所有的系统调用实现转移 从头文件转移到C文件中; 二是增加几个有关文件打开和关闭的接口 主要是将系统调用做成单独的app库,这个库可以供其它所有的应用程序使用 2、导入newlib库&#xff…

CleanClip for Mac v2.2.0 剪贴板历史管理软件正式激活版

CleanClip 是一款专为 Mac 用户设计的强大剪贴板历史管理工具。它能够自动保存您复制的内容,让您轻松访问和管理剪贴板历史记录,大大提高工作效率。 下载地址:CleanClip for Mac v2.2.0 剪贴板历史管理软件正式激活版 主要特点 自动保存剪贴板历史 CleanClip 会自…

基于麻雀SSA优化BP神经网络多输入多输出的数据回归预测Matlab程序SSA-BP 含预测新数据程序

基于麻雀SSA优化BP神经网络多输入多输出的数据回归预测Matlab程序SSA-BP 含预测新数据程序 文章目录 一、基本原理1. SSA(麻雀搜索算法)2. BP(反向传播神经网络)3. SSA-BP回归预测的整合 二、实验结果三、核心代码四、代码获取五、…

disk manager操作教程 如何使用Disk Manager组件 Mac如何打开ntfs格式文件

macOS系统有一个特别明显的弱点,即不能对NTFS格式磁盘写入数据。想要适合Mac系统使用来回转换磁盘格式又十分麻烦,这该怎么办呢?Tuxera ntfs for mac作为一款Mac完全读写软件,大家在安装该软件后,能充分使用它的磁盘管…

python自动化脚本:让工作自动化起来

Python是一种流行的编程语言,以其简洁和易读性而闻名。它提供了大量的库和模块,使其成为自动化各种任务的绝佳选择。 我们将探讨9个Python脚本及其代码,可以帮助您自动化各种任务并提高工作效率。无论您是开发人员、数据分析师还是只是想简化…

跨境多账号登录如何防止IP、cookie和设备关联?

在当今数字化时代,拥有某个平台的多个账号是必要的,但如何防止这些账号之间产生关联,进而导致封号,却是一个需要谨慎对待的问题。 一、 多账号关联的主要因素 1. IP地址 2. Cookie和缓存 3. 设备指纹 二、如何防关联&#xff…

Vue——认识day06_class与style绑定

在Vue中,可以使用v-bind指令来将CSS样式动态地绑定到HTML元素上。有两种方式可以实现CSS与style的绑定: 对象语法:可以将一个包含CSS属性和值的对象传递给v-bind,将对象的属性与HTML元素的style属性进行绑定。例如: …

20.神经网络 - 搭建小实战和 Sequential 的使用

神经网络 - 搭建小实战和 Sequential 的使用 在 PyTorch 中,Sequential 是一个容器(container)类,用于构建神经网络模型。它允许你按顺序(sequential)添加不同的网络层,并将它们串联在一起&…

手机FM LNA方案设计

一 概述 关于手机FM的使用,较为传统的则是在打开FM应用前先插入有线耳机才能使用FM应用。然而随着智能手机的进步以及有线耳机日益被无线蓝牙耳机所代替,内置FM LNA方案被应用的越来越多,无需插入有线耳机,复用例如GSM天线也能实…

JavaScript初级——键盘事件

1、 onkeydown —— 按键被按下 —— 如果一直按着某个键不松手,则事件会一直触发 —— 连续触发时,第一次和第二次之间会间隔稍微长一点,其他的会非常的快,这种设计是为了放置误操作的发生 2、 onkeyup —— 按键被松…

Substance 3D Stager for Mac/Win:高效三维场景设计利器

Substance 3D Stager是Adobe推出的一款专为Mac和Windows用户设计的三维场景设计和渲染软件,它以其高效、直观的特点,在数字艺术、游戏开发、影视特效等领域赢得了广泛的认可。 核心功能 直观的操作界面:Substance 3D Stager提供了优秀的视觉…

NTP时间服务器是什么?功能是什么?京准电钟

NTP时间服务器是什么?功能是什么?京准电钟 NTP时间服务器是什么?功能是什么?京准电钟 时间同步技术必定将是整个大数据处理系统的重要支撑和保障。时间同步技术使数据产生与处理系统的所有节点具有全局的、统一的标准时间&#x…

让自家的智能语音助手实现todo任务的添加

我家的树莓派在成为了“智能语音助手”后,经过rasa学习训练,已经可以帮忙查日期/时间,查天气预报,进行一些简单的闲聊。但是,我希望它的功能还可以再强大些,比如说,可以帮我记录todo任务。为了实…

猫头虎分享:Python库 TensorFlow 的简介、安装、用法详解入门教程

猫头虎分享:Python库 TensorFlow 的简介、安装、用法详解入门教程 🐯 摘要 今天猫头虎带大家走进 人工智能 的核心领域,深入探讨 TensorFlow 这个强大的 Python库。从 TensorFlow 的基础简介到详细的安装和用法,这篇教程将带你从…

小白学深度学习:知识蒸馏研究综述

为了能够在低资源设备上运行深度学习模型,需要研发高效的小规模网络。知识蒸馏是获取高效小规模网络的一种新兴方法,其主要思想是将学习能力强的复杂教师模型中的“知识”迁移到简单的学生模型中。 知识蒸馏介绍 知识蒸馏是一种教师-学生(Teacher-Stud…

(C++ STL)vector类的简单模拟实现与源码展示

vector类的简单模拟实现 一、前言二、vector 的成员变量三、vector 部分函数实现size、capacityreserveresizeinsert 与注意事项erase构造、析构、赋值拷贝 四、vector 源代码 以下代码环境为 VS2022 C。 一、前言 vector类 本质上就是数据结构中的顺序表。(可参考&#xff1…

Python中的“for循环”:探索其无限潜力

引言 for循环是任何Python程序员工具箱中的必备技能之一。无论是在处理数据时需要遍历数组,还是在编写Web应用时循环处理请求,亦或是进行复杂的算法实现,for循环都能派上大用场。通过掌握for循环的不同用法,我们可以更高效地解决…

谷粒商城实战笔记-269~271-商城业务-订单服务-bug修改

文章目录 一,269-商城业务-订单服务-bug修改二,270-商城业务-订单服务-订单确认页渲染三,271-商城业务-订单服务-订单确认页库存查询四,272-商城业务-订单服务-订单确认页模拟运费效果 一,269-商城业务-订单服务-bug修…

深度学习100问18:什么是负采样

嘿,负采样就像是一个巧妙的“偷懒小妙招”,在自然语言处理的世界里大显身手呢! 一、定义及原理 想象一下,你在训练一个语言小魔法师,它的任务是搞清楚词和词之间的关系。就像在 Skip-gram 模型里,要猜出…