Java 注解

对于注解 Annotation 是从 Java 1.5 开始加入,对于 Java 17 来说,主要是来自模块 java.base 下的包java.lang.annotation。该包提供了 Java 编程语言注解的类库支持。

在没有注解之前, Java 中大量的使用了 XML 配置文件的方式, 比如 Java 之首的 Spring 框架, 在 3.0之前,之后也保留了 xml 配置的方式, 来进行框架相关的配置。 这在项目越来越大的情况下配置文件越来越多,越繁杂,无疑对开发和使用都不是友好的,这个时候就引入了注解Annotation。

对于Java中的注解实现方式是基于源码实现, 对于使用注解和非注解的编程方式,编译的字节码都是一样的。

 使用注解格式
注解的格式,通常情况下使用 @ 符号开始,后面跟上对应的注解名称,以及注解参数和对应的值。
@注解名称([{标识符=元素的值,
标识符={元素的值,元素的值,元素的值},
标识符=Annotation
}])

使用lombok组件,通过注解自动生成一些样板代码,如getter和setter方法、构造函数、equals和hashCode方法等。

未使用lombok组件前

使用Lombok插件后

我们只需加一个注解,LomBok即可自动帮我们生成get和set方法

 使用Lombok,如果IDEA版本在2020.3以上,不需要安装Lombok插件。如果IDEA版本在2020.3以下,需要安装Lombok插件

打开设置,找到Plugins,直接搜索安装就行

 下载lombok.jar  给项目添加依赖

Downloadhttps://projectlombok.org/download 下载lombok.jar,并把下载的jar包添加依赖到项目中就可以使用了,如需了解更多,可以看这篇文章

IDEA必装插件:Lombok、GenerateAllSetter_idea生成实体类的插件_Bridge Fish的博客-CSDN博客icon-default.png?t=N6B9https://blog.csdn.net/qq_57570052/article/details/131694239?ops_request_misc=&request_id=7da6599d226346a3845d0b55607970cb&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~koosearch~default-1-131694239-null-null.268^v1^control&utm_term=IDEA%E5%BF%85%E8%A3%85%E6%8F%92%E4%BB%B6%EF%BC%9ALombok%E3%80%81GenerateAllSetter&spm=1018.2226.3001.4450

内置注解 

代码注解

标注在代码里面的注解,称为代码注解

注解描述
override标记在子类中重写了父类的方法,如果不是则会报错
deprecated标记此方法已经过时了
suppressWarnings忽略注解声明的警告

元注解

元注解可以理解为注解的注解

注解描述
retention标记注解怎么保存
documented使用此注解可以让注解保存到javadoc文档中
target标记注解的作用域
Inherirted标记注解有继承性

新增的注解

注解描述
SafavarArgs忽略方法或者构造方法的参数为泛型所产生的警告
FuntionalInterface标注一个函数性接口
repeatable标识某注解可以在同一个声明上使用多次

JAVA注解三大类

每一个annotation都有多个elementType和唯一的一个retentionPolicy

1.Annotation接口

package java.lang.annotation;
public interface Annotation {

    boolean equals(Object obj);

    int hashCode();

    String toString();

    Class<? extends Annotation> annotationType();
}

2.ElementType枚举 

public enum ElementType {
    TYPE, //在接口、类、枚举上声明注解
    METHOD,//在方法上声明注解
    FIELD,//在字段上声明注解
    PARAMETER,//在参数上声明注解
    LOCAL_VARIABLE,//在局部变量上声明注解
    PACKET,在包上声明注解
    CONSTRUCTOR,//在构造方法上声明注解
    ANNOTATIONTYPE,//在注解类型上声明注解
}

3.RtentionPolicy枚举

public enum RtentionPolicy {
    SOURCE,         //注解信息存在代码的编译过程,编译结束,注解结束
    CLASS,          //注解信息保存在字节码文件中
    RUNTIME         //注解信息保存在字节码文件中,并可以被JVM虚拟机读取
}

4.举例SuppressWarnings详解

@Doucumented
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}
  • @Doucumented代表的是SuppressWarnings注解可以保存javadoc文档里面的
  • @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) 表示的是该注解可以作用域。
  • @Retention(RetentionPolicy.SOURCE) 表示注解仅仅在存在编译期间,编译结束则消失
  • String[] value();表示SuppressWarnings 有多个值;

SuppressWarnings的常用关键字

关键字描述
deprecation忽略使用不被赞成、过时所产生的警告
unchecked忽略集合中没有声明类型的所产生的警告
fallthrouthswitch程序块,忽略下一种情况没有break的情况
path忽略类地址、源路径不存在的警告
serial序列化的时候,忽略类中缺少serialVersionUUid警告
finally忽略finally语句块不能正常执行的的警告
path忽略类地址、源路径不存在的警告
serial序列化的时候,忽略类中缺少serialVersionUUid警告
finally忽略finally语句块不能正常执行的的警告
public class A {
        void show() {
    }
}

未使用SuppressWarnings注解前,会有警告

 使用后,忽略警告

自定义注解 

我们自定义注解类时,使用的注解,声明注解类时使用的注解。

元注解,本质是注解的注解。

@Documented 该注解是一个标注注解, 主要是为了进行 javadoc 生成代码的时候, 显示注解内容。

@Retention注解接口 可以理解该接口的生命周期, 也就是在运行时保留该注解多少时间。

也就是说对于 Retention 注解的接口参数就三个,分别是: RetentionPolicy.CLASS

RetentionPolicy.RUNTIME 以及 RetentionPolicy.SOURCE。如果注解接口不包含该注解,则默认的策略是:RetentionPolicy.CLASS

  • RetentionPolicy.CLASS: 编译器将把注释记录在class文件中。当运行Java程序时,JVM不在保留注释,这是默认值。
  • RetentionPolicy.RUNTIME: 编译器将把注释记录在class文件中。当运行Java程序时,JVM也会保留注释,程序可以通过反射获取该注释。
  • RetentionPolicy.SOURCE: 注解仅存在于源码中,在class字节码文件中不包含。

声明注解类方式:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface My {
}

@Target 对于 @Target 注解接口,是注解接口的上下文,注解对象所在的位置

@Target也是用于修饰一个Annotation定义,它用于指定被修饰Annotation能用于修饰那些程序元素。

@Target Annotation也包含一个名为value的成员变量,该成员变量只能是如下几个:

  • ElementType.ANNOTATION_TYPE: 指定该策略的Annotation只能修饰Annotation
  • ElementType.CONSTRUCTOR: 指定该策略的Annotation能修饰构造器。
  • ElementType.FIELD: 指定该策略的Annotation只能修饰成员变量。
  • ElementType.LOCAL_VARIABLE: 指定该策略的Annotation只能修饰局部变量。
  • ElementType.METHOD: 指定该策略的Annotation只能修饰方法。
  • ElementType.PACKAGE: 指定该策略的Annotation只能修饰包定义。
  • ElementType.PARAMETER: 指定该策略的Annotation可以修饰参数。
  • ElementType.TYPE: 指定该策略的Annotation可以修饰类、接口(包括注释类型)或枚举定义。

声明注解

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Documented
@Target({TYPE, METHOD, PARAMETER, FIELD, LOCAL_VARIABLE}) //type 类上 method 方法上 parameter 参数变量上 field 属性上
@Retention(RUNTIME)
public @interface Ann {
    String name();
    int age();
    String sex() default "男";
}

使用注解

@Ann(name = "李丽", age = 18, sex = "女")
public class User {
    @Ann(name = "李丽", age = 18)
    String name;
    @Ann(name = "张三丰", age = 22)
    public void show(@Ann(name = "jack", age = 55) Ann ann) {
        @Ann(name = "lisi", age = 11)
        String lisi = "lisi11";
    }
}

使用自定义注解需要反射技术

反射读取注解信息
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class UserDemo {
    public static void main(String[] args) throws Exception {
        Class<User> c = User.class;

        // 反射类读取类上的注解信息
        Ann ann = c.getAnnotation(Ann.class);
        System.out.println(ann.name());
        System.out.println(ann.age());
        System.out.println(ann.sex());

        // 反射类字段上的注解信息
        Field f = c.getDeclaredField("name");
        Ann fann = f.getAnnotation(Ann.class);
        System.out.println(fann.name());
        System.out.println(fann.age());
        System.out.println(fann.sex());

        // 反射类方法上的注解信息
        Method show = c.getMethod("show", Ann.class);
        System.out.println(show);
        Ann sann = show.getAnnotation(Ann.class);
        System.out.println(sann.name());
        System.out.println(sann.age());
        System.out.println(sann.sex());

        // 反射方法参数上的注解信息
        Parameter par = show.getParameters()[0];
        Ann annotation = par.getAnnotation(Ann.class);
        System.out.println(annotation.name());
        System.out.println(annotation.age());
        System.out.println(annotation.sex());
    }
}

 总结
注释程序人员查看源码时看 ,注解 jvm运行字节码文件时查看信息
1. 如果注解难于理解,你就把它类同于标签,标签为了解释事物,注解为了反射读取解释代码执行。
2. 注解的基本语法,创建如同接口,但是多了个 @ 符号。 public @interface Ann{}
3. 注解的元注解 @Documented @Retention @Target
4. 注解的属性 String value(); String name() default “james” int age() default 18
5. 注解主要给编译器及工具类型 ( 框架 ) 的软件用的。
6. 注解的提取需要借助于 Java 的反射技术,反射比较慢 ( 但功能强大,是开发框架人员必须掌握,也是标志升级为动态语句的方式) ,所以注解使用时也需要谨慎计算时间成本。

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

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

相关文章

【C#】.Net Framework框架下的Authorize权限类

2023年&#xff0c;第31周&#xff0c;第3篇文章。给自己一个目标&#xff0c;然后坚持总会有收货&#xff0c;不信你试试&#xff01; 在C#的.NET Framework中&#xff0c;你可以使用Authorize类来处理权限认证。Authorize类位于System.Web.Mvc命名空间中&#xff0c;它提供了…

JVM | 基于类加载的一次完全实践

引言 我在上篇文章&#xff1a;JVM | 类加载是怎么工作的 中为你介绍了Java的类加载器及其工作原理。我们简单回顾下&#xff1a;我用一个易于理解的类比带你逐步理解了类加载的流程和主要角色&#xff1a;引导类加载器&#xff0c;扩展类加载器和应用类加载器。并带你深入了解…

苍穹外卖-day09

苍穹外卖-day09 本项目学自黑马程序员的《苍穹外卖》项目&#xff0c;是瑞吉外卖的Plus版本 功能更多&#xff0c;更加丰富。 结合资料&#xff0c;和自己对学习过程中的一些看法和问题解决情况上传课件笔记 视频&#xff1a;https://www.bilibili.com/video/BV1TP411v7v6/?sp…

优化企业集成架构:iPaaS集成平台助力数字化转型

前言 在数字化时代全面来临之际&#xff0c;企业正面临着前所未有的挑战与机遇。技术的迅猛发展与数字化转型正在彻底颠覆各行各业的格局&#xff0c;不断推动着企业迈向新的前程。然而&#xff0c;这一数字化时代亦衍生出一系列复杂而深奥的难题&#xff1a;各异系统之间数据…

山水TW91耳机恢复出厂设置

当出现左右耳不互联或者设备无法配对时&#xff0c;可按照以下操作进行重置&#xff1a; ①先在手机端删除“SANSUI”耳机的配对信息。 ②耳机开机未连接状态下&#xff0c;连击4次左/右耳功能键后复位&#xff0c;耳机自动关机清除配对。&#xff08;提示已关机表示操作正确&a…

如何快速用Go获取短信验证码

要用Go获取短信验证码&#xff0c;通常需要连接到一个短信服务提供商的API&#xff0c;并通过该API发送请求来获取验证码。由于不同的短信服务提供商可能具有不同的API和授权方式&#xff0c;我将以一个简单的示例介绍如何使用Go语言来获取短信验证码。 在这个示例中&#xff0…

使用 OpenCV 和 GrabCut 算法进行交互式背景去除

一、说明 我想&#xff0c;任何人都可以尝试从图像中删除背景。当然&#xff0c;有大量可用的软件或工具能够做到这一点&#xff0c;但其中一些可能很昂贵。但是&#xff0c;我知道有人使用窗口绘画3D魔术选择或PowerPoint背景去除来删除背景。 如果您是计算机视觉领域的初学者…

C#时间轴曲线图形编辑器开发1-基本功能

目录 一、前言 1、简介 2、开发过程 3、工程下载链接 二、基本功能实现 1、绘图面板创建 &#xff08;1&#xff09;界面布置 &#xff08;2&#xff09;显示面板代码 &#xff08;3&#xff09; 面板水平方向、竖直方向移动功能实现 &#xff08;4&#xff09;面板放…

2024届IC秋招兆易创新数字IC后端笔试面试题

数字IC后端实现PR阶段设计导入需要哪些文件&#xff1f; 设计导入需要的文件如下图所示。这个必须熟练掌握。只要做过后端训练营项目的&#xff0c;对这个肯定是比较熟悉的。大家还要知道每个input文件的作用是什么。 在吾爱IC后端训练营Cortexa7core项目中&#xff0c;你认为…

华为刷题:HJ3明明随机数

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);int N scan.nextInt();int[] arr new int[N];for (int i 0; i < N; i) {int n sca…

数据库压力测试方法小结

一、前言 在前面的压力测试过程中&#xff0c;主要关注的是对接口以及服务器硬件性能进行压力测试&#xff0c;评估请求接口和硬件性能对服务的影响。但是对于多数Web应用来说&#xff0c;整个系统的瓶颈在于数据库。 原因很简单&#xff1a;Web应用中的其他因素&#xff0c;…

基于ChatGPT聊天的零样本信息提取7.25

基于ChatGPT聊天的零样本信息提取 摘要介绍ChatIE用于零样本IE的多轮 QA 实验总结 摘要 零样本信息提取&#xff08;IE&#xff09;旨在从未注释的文本中构建IE系统。由于很少涉及人类干预&#xff0c;因此具有挑战性。 零样本IE减少了数据标记所需的时间和工作量。最近对大型…

【Git】Git的概念安装工作区-暂存区-版本库

文章目录 Git概念-版本控制器Git安装Centos平台&ubuntu Git基本操作创建Git本地仓库配置Git 认识⼯作区、暂存区、版本库添加文件查看.git文件总结添加文件场景2 Git概念-版本控制器 引入 我们在编写各种⽂档时&#xff0c;为了防⽌⽂档丢失&#xff0c;更改失误&#xff0…

sql server表值函数

一、创建测试表 Employees 二、创建表值函数 -- DROP FUNCTION TableIntSplit;CREATE FUNCTION TableIntSplit(Text NVARCHAR(4000),Sign NVARCHAR(4000)) RETURNS tempTable TABLE(Id INT ) AS BEGIN DECLARE StartIndex INT DECLARE FindIndex INT DECLARE Content VARCHAR(…

Spring之IoC源码分析及设计思想(一)——BeanFactory

关于Spring的IOC Spring 是一个开源的 Java 平台&#xff0c;它提供了一种简化应用程序开发的框架。它是一个分层的框架&#xff0c;包括两个主要的内核&#xff1a;控制反转&#xff08;IOC&#xff09;和面向切面编程&#xff08;AOP&#xff09;。IOC 允许应用程序将组件之…

STM32MP157驱动开发——按键驱动(POLL 机制)

文章目录 “POLL ”机制&#xff1a;APP执行过程驱动使用的函数应用使用的函数pollfd结构体poll函数事件类型实现原理 poll方式的按键驱动程序(stm32mp157)gpio_key_drv.cbutton_test.cMakefile修改设备树文件编译测试 “POLL ”机制&#xff1a; 使用休眠-唤醒的方式等待某个…

BOB_1.0.1靶机详解

BOB_1.0.1靶机详解 靶机下载地址&#xff1a;https://download.vulnhub.com/bob/Bob_v1.0.1.ova 这个靶机是一个相对简单的靶机&#xff0c;很快就打完了。 找到ip地址后对IP进行一个单独的扫描&#xff0c;发现ssh端口被改到25468了&#xff0c;等会儿登陆时候需要用到。 目…

SQL注入原理分析

前言 order by的作用及含义 order by 用于判断显示位&#xff0c;order by 原有的作用是对字段进行一个排序&#xff0c;在sql注入中用order by 来判断排序&#xff0c;order by 1就是对一个字段进行排序&#xff0c;如果一共四个字段&#xff0c;你order by 5 数据库不知道怎么…

物联网场景中的边缘计算解决方案有哪些?

在物联网场景中&#xff0c;边缘计算是一种重要的解决方案&#xff0c;用于在物联网设备和云端之间进行实时数据处理、分析和决策。HiWoo Box作为工业边缘网关设备&#xff0c;具备边缘计算能力&#xff0c;包括单点公式计算、Python脚本编程以及规则引擎&#xff0c;它为物联网…

使用Kmeans算法完成聚类任务

聚类任务 聚类任务是一种无监督学习任务&#xff0c;其目的是将一组数据点划分成若干个类别或簇&#xff0c;使得同一个簇内的数据点之间的相似度尽可能高&#xff0c;而不同簇之间的相似度尽可能低。聚类算法可以帮助我们发现数据中的内在结构和模式&#xff0c;发现异常点和离…