【Java 基础】15 注解

文章目录

    • 1.什么是注解
    • 2.元注解
      • 1)定义
      • 2)分类
    • 3.内置注解
    • 4.自定义注解
    • 5.注解的基本语法
    • 6.验证注解是否生效
    • 7.注解的使用场景
    • 8.注解的注意事项
    • 结语

1.什么是注解

注解(Annotation)可以理解成一种特殊的 “注释”

注解定义时以 @ 符号开头,可以写在构造方法方法字段等元素上,为这些元素提供额外的信息。

如下图: 我们为实体类 User 添加了 两个 Lombok 的注解,用以为属性增加 setget 方法
在这里插入图片描述

2.元注解

1)定义

元注解(meta-annotation)是用于注解其他注解的注解

这个听起来或许有一点绕,这些是注解的基础,它们用于提供注解拥有哪些行为信息

如下图:Lombok 在定义 Getter 的时候,使用了两个元注解 @Target 和 @Retention
在这里插入图片描述

2)分类

在这里插入图片描述

  1. @Target 用于指定注解可以应用的程序元素类型,包括 TYPE(类、接口、枚举)、FIELD(字段)、METHOD(方法)等。如果没有 @Target 注解,注解可以应用于任何程序元素。

    @Target(ElementType.TYPE)
    public @interface DemoAnnotation {
        // 注解的定义
    }
    
  2. @Retention 用于指定注解的生命周期,即注解在何时有效。可以有三个值:SOURCE(源代码时有效)、CLASS(编译时有效,默认值)、RUNTIME(运行时有效),90% 使用的都是 RUNTIME

    @Retention(RetentionPolicy.RUNTIME)
    public @interface DemoAnnotation {
        // 注解的定义
    }
    
  3. @Documented 用于指定注解是否包含在 Javadoc 文档中。如果一个注解使用了 @Documented,那么它将会被包含在生成的文档中。

    @Documented
    public @interface DemoAnnotation {
        // 注解的定义
    }
    
  4. @Inherited 用于指定一个注解是否具有继承性。如果一个类使用了带有 @Inherited 的注解,并且其子类没有使用相同的注解,那么子类将继承父类的注解。

    @Inherited
    public @interface DemoAnnotation {
        // 注解的定义
    }
    
  5. @Repeatable 用于指定注解是否可以重复应用于同一程序元素。如果一个注解使用了 @Repeatable,则可以在同一程序元素上多次使用该注解。

    @Repeatable(MyAnnotations.class)
    public @interface MyAnnotation {
        // 注解的定义
    }
    
    public @interface MyAnnotations {
        MyAnnotation[] value();
    }
    

上述元注解用于控制注解的行为,提供了更多的灵活性和可定制性。这些元注解的组合使得我们可以更加精细地定义和使用注解,以满足不同的需求。

3.内置注解

Java 提供了一些内置的注解,它们具有特殊的含义和用途。其中几个常用的内置注解包括:

  • @Override 用于标记一个方法是覆盖父类的方法。
  • @Deprecated 用于标记已经过时的方法等,提醒开发者不再使用。
  • @SuppressWarnings 用于抑制编译器警告

4.自定义注解

除了使用内置注解,我们还可以定义自己的注解。自定义注解使用 @interface 关键字,并且可以定义元素(成员变量等)。

例如:

@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface ClassInfoAnnotation {
    String author();
    String version() default "1.0.0";
    String description();
}

上述代码定义了一个名为 ClassInfoAnnotation 的注解,它有三个元素:authorversiondescription

5.注解的基本语法

@interface 注解名 {

}

**示例代码:**这里使用上一步自定义的注解

@ClassInfoAnnotation(author = "Cheney", description = "This class is Hello")
class Test {
    public void sayHello(){
        System.out.println("hello");
    }
}

Test 类上应用了 ClassInfoAnnotation 这个注解,并为元素 authordescription 赋了值,version 使用默认值。

6.验证注解是否生效

在上面两个步骤中,我们定义了一个自己的注解 ClassInfoAnnotation,也在 Test 类上应用了,那么这个注解是否生效了呢?是否可以帮助我们做一些事情呢?

例如:打印类的信息(author,version,description)

示例代码:

    public static void main(String[] args) {
        // 获取类上的注解
        ClassInfoAnnotation anno = Test.class.getAnnotation(ClassInfoAnnotation.class);
        // 打印注解信息
        System.out.println("Author: " + anno.author());
        System.out.println("Version: " + anno.version());
        System.out.println("Description: " + anno.description());
    }

输出结果:

Author: Cheney
Version: 1.0.0
Description: This class is Hello

7.注解的使用场景

  • 文档生成: 注解可以用于生成文档,例如 Java 中的 Javadoc 工具。
  • 编译时检查: 注解可以用于在编译时进行静态检查,提供更严格的类型检查。
  • 运行时处理: 注解可以在运行时通过反射进行处理,实现动态操作。
  • 代码分析工具: 注解可以被代码分析工具用来检查和验证代码。
  • 框架和库: 许多框架和库使用注解来配置和扩展功能,例如 Spring 框架中的注解驱动开发。

8.注解的注意事项

  • 注解本身并不影响程序的实际逻辑,它只是提供了一些额外的元数据信息。
  • 注解可以包含元素,元素的值可以是基本类型、字符串、枚举、注解或以上类型的数组。
  • 注解的使用需要通过反射或其他工具进行处理。
  • 注解的定义和使用应遵循一定的规范和命名规则。

结语

Java 注解是一种强大的元数据机制,它在代码中提供了一种轻量级的、结构化的方式来添加额外的信息。通过合理地使用注解,开发者可以提高代码的可读性、可维护性,并在一些特定场景中实现更加灵活和强大的功能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

02.PostgreSQL 查询处理期间发生了什么?

PostgreSQL 查询处理期间发生了什么? 文中主要内容引用自PostgreSQL指南:内幕探索 查询处理是PostgreSQL中最为复杂的子系统。如PostgreSQL官方文档所述,PostgreSQL支持SQL2011标准中的大多数特性,查询处理子系统能够高效地处理这…

深度学习记录--梯度下降法

什么是梯度下降法? 梯度下降法是用来求解成本函数cost函数中使得J(w,b)函数值最小的参数(w,b) 梯度下降法的实现 通过对参数w,b的不断更新迭代,使J(w,b)的值趋于局部最小值或者全局最小值 如何进行更新? 以w为例:迭代公式 ww-…

Spring MVC学习随笔-控制器(Controller)开发详解:接受客户端(Client)请求参数

学习视频:孙哥说SpringMVC:结合Thymeleaf,重塑你的MVC世界!|前所未有的Web开发探索之旅 第三章、SpringMVC控制器开发详解 3.1 核心要点 💡 1. 接受客户端(client)请求参数[讲解] 2…

MySQL 临时数据空间不足导致SQL被killed 的问题与扩展

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内,可以解决你的问题。加群请联系 liuaustin3 ,(共1730人左右 1 2 3 4 5&#xff0…

【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(2)后端跨域、登录模块、springboot分层架构、IDEA修改快捷键、vue代码风格

项目笔记为项目总结笔记,若有错误欢迎指出哟~ 【项目专栏】 【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(1)spring boot项目搭建、vue项目搭建、微信小程序项目搭建 【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(2)后端跨域、登录模块、sp…

自然语言处理 (NLP) 中的组合语义分析

埃弗顿戈梅德(Everton Gomede) 一、介绍 自然语言处理 (NLP) 中的组合语义分析是一个引人入胜且复杂的话题。为了充分理解它,将这个概念分解成它的基本组成部分是至关重要的:组合语义及其在NLP中的应用。组…

【开源】基于JAVA的超市账单管理系统

项目编号: S 032 ,文末获取源码。 \color{red}{项目编号:S032,文末获取源码。} 项目编号:S032,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 总体设计3.2 前端设计3…

EasyExcel写入多个sheet

直接上代码&#xff1a; public static void main(String[] args) {// 设置excel工作簿ExcelWriter excelWriter EasyExcel.write("F:\\excel\\a.xls").build();List<User> userList new ArrayList<>();userList.add(new User("lisi", "…

Redis缓存的使用

什么是缓存 缓存就是数据交换的缓冲区&#xff0c;是存储数据的临时地方&#xff0c;一般读写性能较高。 缓存的作用&#xff1a; 降低后端负载提高读写效率&#xff0c;降低响应时间 缓存的成本&#xff1a; 数据一致性成本代码维护成本运维成本 Redis特点 键值型数据库…

STM32DAC输出可调电压、三角波、正弦波

STM32DAC输出可调电压、三角波、正弦波 DAC简介输出可调电压输出正弦波输出三角波 本期内容我们将学习stm32DAC的原理和使用方法 DAC简介 DAC&#xff0c;全称&#xff1a;Digital-to-Analog Converter&#xff0c;指数字/模拟转换器。可以将数字量转换为模拟量进行输出&#…

深入了解Vue.js:构建现代、响应式的前端应用

文章目录 1. Vue.js简介1.1 安装Vue.js 2. Vue的核心概念2.1 数据驱动2.2 组件化2.3 生命周期钩子 3. Vue的特性3.1 响应式数据3.2 模板语法3.3 组件通信 4. 示例项目结语 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1…

2023 如何下载最干净的 win10 win11 微软官方原版系统镜像(详细图文)

前言 不会吧不会吧&#xff0c;不会到现在还有人不会下载原版系统镜像吧 开始 win10官方下载工具下载地址&#xff1a;https://www.microsoft.com/zh-cn/software-download/windows10 win11官方下载工具下载地址&#xff1a;https://www.microsoft.com/zh-cn/software-downl…

java实验:数据库应用(idea+mysql+php)

设计用户注册和登录界面&#xff0c;实现用户注册和登录操作。 设计用户注册/登录界面;使用工具在MySQL中创建user表&#xff0c;包括学号、姓名、密码、专业、班级&#xff1b;实现注册操作&#xff1a;在user表中插入一条新纪录&#xff0c;但学号不能重复&#xff1b;实现登…

Mybatis 操作续集2(结合上文)

Mybatis 是一个持久层框架,用于简化数据库的操作,和Spring 没有任何关系,我们现在能使用它是因为 Spring Boot 把Mybatis 的依赖给引入进来了,在 pom.xml 里面 Mybatis 如何进行重命名? 看最后两行代码,这样就能重命名了 package com.example.mybatisdemo.mapper;import com…

最大单词数算法分析

题目描述&#xff1a; 算法一&#xff1a; 代码实现&#xff1a; # include<stdio.h> # include<string.h>int main(){//char text[100]"leet code";//char brokenLetters[26]"lt";char text[100]"hello world";char brokenLetters…

代码随想录第二十二天(一刷C语言)|组合总数电话号码的字母组合

创作目的&#xff1a;为了方便自己后续复习重点&#xff0c;以及养成写博客的习惯。 一、组合总数 思路&#xff1a;参考carl文档和视频 1、需要一维数组path来存放符合条件的结果&#xff0c;二维数组result来存放结果集。 2、targetSum 目标和&#xff0c;也就是题目中的…

AD7124-4 实测热电偶数据读取,电压精度到稳定到±1uV, 电压波动260nV, 温度精度到±0.01℃

AD7124-4 实测热电偶数据读取&#xff0c;电压精度到稳定到1uV, 电压波动260nV, 温度精度到0.01℃ AD7124_STM32_ADI官网例程使用stm32 和ad7124做温控调试&#xff0c;发现效果还是不错的&#xff0c;至少比ads1256的效果好多啦&#xff01;Chapter1 AD7124-4 实测热电偶数据读…

OpenSSH 漏洞修复升级最新版本

Centos7系统ssh默认版本一般是OpenSSH7.4左右&#xff0c;低版本是有漏洞的而且是高危漏洞&#xff0c;在软件交付和安全扫描上是过不了关的&#xff0c;一般情况需要升级OpenSSH的最新版本 今天详细说下升级最新版本的处理过程&#xff08;认真看会发现操作很简单&#xff0c…

springboot 整合 Spring Security 上篇

1.创建springBoot 项目工程(spring6.0的底层、JDK17) 1.添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>配置完成启动访问controller会出现登录…

P5 链表 尾部插入新节点(不是指定点)

目录 前言 01 链表数据插入之直接在链表尾插入&#xff08;不是指定点&#xff09; 02 尾插创建链表优化 示例代码 前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C》✨✨✨ &#x1f525; 推荐专栏2: 《 Linux C应用编程&#xff08;概念…