注解的定义

一、理论说明

1. 注解的定义

Java 注解是从 JDK 5.0 开始引入的一种元数据机制,它可以为代码添加额外的信息,这些信息不影响程序的运行逻辑,但可以在编译期、类加载期或运行期被读取和处理。注解本质上是一种特殊的接口,所有注解都自动继承java.lang.annotation.Annotation接口。注解可以应用于类、方法、字段、参数等程序元素上,用于实现如代码检查、配置信息、生成文档等功能。

2. 内置注解与自定义注解的区别

  • 定义方式
    • 内置注解是 Java 语言自带的,在java.langjava.lang.annotation等包中已经定义好,例如@Override@Deprecated@SuppressWarnings等,开发者可以直接使用。
    • 自定义注解需要开发者自己使用@interface关键字来定义新的注解类型,通过元注解(如@Retention@Target等)来指定注解的保留策略和适用范围 。
  • 功能特性
    • 内置注解具有特定的、固定的功能。比如@Override用于确保方法正确重写父类方法,编译器会进行检查;@Deprecated用于标记不建议使用的代码元素,提醒开发者避免使用 。
    • 自定义注解功能更加灵活,开发者可以根据具体需求定义注解的属性和处理逻辑,用于实现特定的业务逻辑,如自定义的权限控制、数据校验等。
  • 使用场景
    • 内置注解适用于通用的、常见的代码标注场景,是 Java 语言为了提高代码质量和开发效率提供的基础工具 。
    • 自定义注解适用于项目中特定的、个性化的需求,例如在 Web 开发中定义注解来处理请求日志记录、在持久化层定义注解来映射数据库表结构等。

二、常用注解与元注解

1. 内置常用注解

@Override

用于标识一个方法是重写父类的方法。如果被注解的方法并非真正重写父类方法,编译器会报错。例如:

class Animal {public void speak() {System.out.println("动物发出声音");}
}class Dog extends Animal {@Overridepublic void speak() {System.out.println("狗汪汪叫");}
}
@Deprecated

用于标记不再建议使用的类、方法或字段。当其他开发者使用被该注解标记的元素时,编译器会给出警告。例如:

@Deprecated
public void oldMethod() {System.out.println("这是一个不再建议使用的方法");
}
@SuppressWarnings

用于抑制编译器产生的警告信息。可以通过指定警告类型,如unchecked(抑制未检查类型转换警告)、deprecation(抑制使用已过时元素的警告)等。例如:

import java.util.ArrayList;
import java.util.List;public class Main {@SuppressWarnings("unchecked")public static void main(String[] args) {List list = new ArrayList();list.add("元素");}
}

2. 元注解

@Retention

用于指定注解的保留策略,即注解在什么阶段还存在。@Retention有三个取值:

四、面试题

题目:

答案:

五、自我总结

通过对 Java 注解的学习,我们掌握了一种强大且灵活的元数据添加方式。内置注解在日常开发中能有效提高代码质量和规范性,而自定义注解结合元注解,为满足个性化业务需求提供了有力工具。掌握@Override@Deprecated@SuppressWarnings等内置注解,以及@Retention@Target等元注解的使用,能让我们在实际编程中根据不同场景合理运用注解。在实际应用场景中,如代码规范检查、框架配置、日志记录等方面,注解都能发挥重要作用。合理使用注解不仅可以使代码结构更清晰,还能提高代码的可维护性和扩展性,在大型项目开发和框架设计中具有重要意义 。

  • RetentionPolicy.SOURCE:注解只保留在源文件中,编译成字节码文件时就会被丢弃,例如@Override注解。
  • RetentionPolicy.CLASS:注解保留在字节码文件中,但在运行时无法获取,这是默认的保留策略。
  • RetentionPolicy.RUNTIME:注解不仅保留在字节码文件中,在运行时也可以通过反射获取和处理。例如:
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME)
    @interface MyRuntimeAnnotation {}
    @Target

    用于指定注解可以应用的程序元素类型,如类、方法、字段等。@Target的取值包括:

  • ElementType.TYPE:应用于类、接口、枚举等类型。
  • ElementType.METHOD:应用于方法。
  • ElementType.FIELD:应用于字段。
    例如:
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Target;@Target(ElementType.METHOD)
    @interface MyMethodAnnotation {}

    三、应用实例

    以下代码展示了自定义注解及其使用和处理:

    import java.lang.annotation.*;
    import java.lang.reflect.Method;// 定义自定义注解
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    @interface Loggable {String value() default "";
    }class Calculator {@Loggable("执行加法运算")public int add(int a, int b) {return a + b;}public int subtract(int a, int b) {return a - b;}
    }public class Main {public static void main(String[] args) throws NoSuchMethodException {Calculator calculator = new Calculator();Method addMethod = calculator.getClass().getMethod("add", int.class, int.class);if (addMethod.isAnnotationPresent(Loggable.class)) {Loggable loggable = addMethod.getAnnotation(Loggable.class);System.out.println("注解信息: " + loggable.value());}int result = calculator.add(3, 5);System.out.println("计算结果: " + result);}
    }
    代码解释
  • 定义自定义注解:使用@interface关键字定义Loggable注解,通过@Retention(RetentionPolicy.RUNTIME)指定该注解在运行时可用,@Target(ElementType.METHOD)指定该注解只能应用于方法上,同时定义了一个value属性。
  • 使用注解:在Calculator类的add方法上使用@Loggable注解,并设置value属性为 “执行加法运算” 。
  • 处理注解:在main方法中,通过反射获取add方法,使用isAnnotationPresent方法检查该方法是否存在Loggable注解。如果存在,则使用getAnnotation方法获取注解实例,并输出注解的value属性值,最后调用add方法进行计算并输出结果。

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

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

相关文章

面试实践AND面经热点题目总结

1、对于Rocketmq消息积压、丢失如何解决? 消息积压原因以及解决方案 🎯 产生原因: 消费者处理能力弱,消费速度远低于生产速度; 网络不稳定,消费者拉取消息失败; 消费端异常(如处理…

【KWDB 创作者计划】使用Docker实现KWDB数据库的快速部署与配置

【KWDB 创作者计划】使用Docker实现KWDB数据库的快速部署与配置 前言一、KWDB介绍1.1 KWDB简介1.2 主要特点1.3 典型应用场景 二、环境介绍2.1 部署环境要求2.2 本地环境规划2.3 部署模式 三、部署Docker环境3.1 安装相关工具3.2 配置Docker软件源3.3 更新软件源3.4 安装Docker…

JWT深度解析:现代Web身份验证的通行证-优雅草卓伊凡

# JWT深度解析:现代Web身份验证的通行证 ## 一、JWT的本质与构成 ### 1.1 JWT的定义解析 JWT(JSON Web Token)是一种**开放标准(RFC 7519)**,用于在各方之间安全地传输信息作为JSON对象。这种信息可以被…

前端缓存踩坑指南:如何优雅地解决浏览器缓存问题?

浏览器缓存,配置得当,它能让页面飞起来;配置错了,一次小小的上线,就能把你扔进线上 bug 的坑里。你可能遇到过这些情况: 部署上线了,结果用户还在加载旧的 JS;接口数据改了&#xf…

2022年8月,​韩先超对中移信息进行微服务架构原理(Docker+k8s+DevOps+Go等)培训

2022年8月,​韩先超对中移信息进行微服务架构原理(Dockerk8sDevOpsGo等)培训 2022年8月,在企业数字化转型和云原生架构加速演进的背景下, 中移信息技术有限公司特别邀请云原生与DevOps领域专家 韩先超老师&#xff0c…

ComfyUI 学习笔记,案例 6 :FLUX 模型文生图

背景 刚开始了解 Comfy UI 的时候,随便找了一个资料,对着这篇 《Flux在ComfyUI里的下载与安装》 进行操作的,下载了这里面的模型到本机。 玩了几天,大概对 ComfyUI 有了一点了解,知道了 Flux 这是一个模型&#xff0…

Docker + Watchtower 实现容器自动更新:高效运维的终极方案

文章目录 前言一、Watchtower 简介二、Watchtower 安装与基本使用1. 快速安装 Watchtower2. 监控特定容器 三、Watchtower 高级配置1. 设置检查间隔2. 配置更新策略3. 清理旧镜像4. 通知设置 四、生产环境最佳实践1. 使用标签控制更新2. 更新前执行健康检查3. 结合CI/CD流水线 …

从易发性分析到灾后规划,AI大模型如何颠覆传统地质灾害防治?

地质灾害是指全球地壳自然地质演化过程中,由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。在降水、地震等自然诱因的作用下,地质灾害在全球范围内频繁发生。我国不仅常见滑坡灾害,还包括崩塌、泥石流…

第37次CCF第三题--模板展开--stringstream读取字符串

1 a hello 1 b world 2 c $a $b 1 d good $c 1 a hi 1 e good $c1 a hello 1 b world 2 c $a $b 3 c 1 a hi 3 c将会输出:10 和 7,对应的变量的值为: helloworld hiworld 需要注意的是,在使用间接赋值语句时,在变量的…

深度学习:智能车牌识别系统(python)

这是一个基于opencv的智能车牌识别系统,有GUI界面。程序能自动识别图片中的车牌号码,并支持中文和英文字符识别,支持选择本地图片文件,支持多种图片格式(jpg、jpeg、png、bmp、gif)。 下面,我将按模块功能对代码进行分段说明: 1. 导入模块部分 import tkinter as tk…

Missashe考研日记-day35

Missashe考研日记-day35 1 专业课408 学习时间:3h学习内容: 完结撒花!!今天把OS最后一节的内容学完了,操作系统也算是告一段落了,接下来是计网时间!不过计网我是上学期才学过的,当…

【Bootstrap V4系列】学习入门教程之 组件-下拉菜单(Dropdowns)

Bootstrap V4系列 学习入门教程之 组件-下拉菜单(Dropdowns) 下拉菜单(Dropdowns)一、Overview 概述二、Accessibility 可访问性三、Examples3.1 Single button 单按钮3.2 Split button 分割按钮 四、Sizing 尺寸 下拉菜单&#x…

红外遥控与NEC编码协议详解

在我们日常生活中,电视遥控器、空调遥控器、风扇遥控器,几乎都离不开“红外遥控”这项技术。虽然我们每天都在用,但你知道里面是怎么通信的吗?本篇文章将带你了解红外遥控的工作原理,重点解析目前应用最广泛的红外编码…

深入剖析 I/O 复用之 select 机制

深入剖析 I/O 复用之 select 机制 在网络编程中,I/O 复用是一项关键技术,它允许程序同时监控多个文件描述符的状态变化,从而高效地处理多个 I/O 操作。select 作为 I/O 复用的经典实现方式,在众多网络应用中扮演着重要角色。本文…

【Linux系列】目录大小查看

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

《AI大模型应知应会100篇》第48篇:构建企业级大模型应用的架构设计

第48篇:构建企业级大模型应用的架构设计 摘要:本文将提供企业级大模型应用的端到端架构设计方案,从系统设计原则到技术栈选择,从高可用保障到安全合规,全面覆盖构建稳健、可扩展、安全的大模型应用所需的工程实践。适合…

人协同的自动化需求分析

多人协同的自动化需求分析是指通过技术工具和协作流程,让多个参与者(如产品经理、开发人员、测试人员等)在需求分析阶段高效协作,并借助自动化手段提升需求收集、整理、验证和管理的效率与质量。以下是其核心要点: 1. …

【战略合作】开封大学_阀门产业学院+智橙PLM

12月20日,在核电厂阀门系列团体标准启动会上,开封大学阀门产业学院与橙色云互联网设计有限公司达成战略合作。 以平台赋能行业,让阀门教育“有的放矢” 会议与会者包括: 开封大学副校长 李治 中国国际科技促进会标准化工作委员…

element-ui日期时间选择器禁止输入日期

需求解释:时间日期选择器,下方日期有禁止选择范围,所以上面的日期输入框要求禁止输入,但时间输入框可以输入,也就是下图效果,其中日历中的禁止选择可以通过【picker-options】这个属性实现,此属…

计算机网络:深入分析三层交换机硬件转发表生成过程

三层交换机的MAC地址转发表生成过程结合了二层交换和三层路由的特性,具体可分为以下步骤: 一、二层MAC地址表学习(基础转发层) 初始状态 交换机启动时,MAC地址表为空,处于学习阶段。 数据帧接收与源MAC学习 当主机A发送数据帧到主机B时,交换机会检查数据帧的源MAC地址。…