[Java基础复习]注解

news/2024/11/18 11:00:03/文章来源:https://www.cnblogs.com/keyongkang/p/18199160

一、什么是注解

  1. 注解是JDK1.5才引入的,Java增加了对元数据(描述数据的数据)的支持,也就是注解。
  2. 注解可以标注在类,成员变量,方法、形参上等。
  3. 注解可以做到在不改变代码逻辑的前提下在代码中嵌入补充信息。
  4. 这些信息被保存在注解的“name=value”键值对中。
  5. 框架=反射+注解+设计模式

从JDK5.0开始,Java增加了对元数据的支持,也就是注解。注解其实就是代码中的特殊标记,这些特殊标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用注解,可以做到在不改变代码原有逻辑的情况下,在代码中嵌入一些补充信息。注解可以标注在类,成员变量,方法,形参上等。

二、JDK内置注解

  1. @Deprecated:

    1. 被这个注解标注的元素已过时。
    2. 这个注解是给编译器看的,编译器看到这个注解之后会有警告提示信息。
  2. @Override:

    1. 修饰实例方法,则该方法必须是个重写方法,否则就会编译失败。
  3. @FunctionalInterface:

    1. “函数式接口”的注解,这个是JDK1.8版本引入的特性。使用@FunctionalInterface标注的接口,则该接口就有且只能存在一个抽象方法,否则就会发生编译错误。

三、自定义注解

  1. 使用@interface来定义注解
@元注解
【修饰符】 @interface 注解名 {返回值类型 属性名() default 默认值;
}
  1. 默认情况下可以出现在类上、方法上、属性上、构造方法上、方法参数上等
  2. 所有自定义的注解,其父类是:java.lang.annotation.Annotation
  3. 不包含任何元素(或者说属性)的注解称为标记注解

四、注解也可以定义属性

  1. 注解可以定义属性,不过属性定义时,属性名后面必须加一个小括号
  2. 如果这个注解中有属性,那么使用的时候,必须给属性赋值。没有赋值则报错,除非在定义注解的时候给属性指定了默认值。
  3. 怎么给属性赋值? @MyAnnotation(属性名=值, 属性名=值, 属性名=值)
  4. 注解的元素在使用时表现为名-值的形式,并且需要放置在@注解()声明之后的括号内。
  5. 属性的类型只能是:
    1. byte、short、int、long、float、double、boolean、char
    2. String、Class、枚举类型、注解类型
    3. 以上所有类型的一维数组形式
    4. 后面写default,给出默认值,如果没有指定默认值,那么使用该注解时必须通过“方法名=值”的形式进行赋值
    5. 如果是数组,则使用{}进行赋值

五、注解的使用

  1. 注解在使用时必须给属性赋值,除非使用了default关键字为属性指定了默认值
  2. 如果属性只有一个,并且属性名是value时,使用注解时value可以省略不写
  3. 如果属性是一个数组,使用注解时,数组值只有一个,数组的大括号可以省略
  4. 注意:任何非基本类型的元素,无论是在源代码声明时还是在注解接口中定义默认值时,都不能使用null作为其值。这个限制使得处理器很难表现一个元素的存在或者缺失的状态。为了绕开这个约束,可以自定义一些特殊的值,比如空字符串或者负数用于表达某个元素不存在。
import java.lang.annotation.*;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SimulatingNull {int id() default -1;String description() default "";
}

六、元注解(用来标注注解的注解)

元注解:用来标注注解的注解(也是JDK内置的注解)

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override{}

常用的元注解:

  1. @Retention:设置注解的保持性
  2. @Target:设置注解可以出现的位置
  3. @Documented:设置注解是否可以生成到帮助文档中
  4. @Inherited:设置注解是否支持继承
  5. @Repeatable:设置注解在某一元素上是否可以重复使用(Java8新特性)

@Retention

@Retention:用于解释新声明注解的保留策略。使用Retention注解时必须用枚举类RetentionPolicy的三个常量对象之一来指定具体的保留策略。

  1. Retention英文意思有保留、保持的意思,它表示注解存在阶段是保留在源代码(编译期)、字节码(类加载)或运行时(JVM中运行)
  2. 在@Retention注解中使用枚举RetectionPolicy来表示注解保留时期。
    1. @Retention(RetectionPolicy.SOURCE):注解仅存在于源码中,在字节码文件中不包含
    2. @Retention(RetectionPolicy.CLASS):注解在字节码文件中存在,但运行时无法获得
    3. @Retention(RetectionPolicy.RUNTIME):注解在字节码文件中存在,且运行时可以通过反射获取(程序员自定义的注解都使用这个策略,因为必须保证程序运行期间使用反射读取到注解信息)

@Target

用于解释新声明的注解可以使用在什么位置。使用Target注解时必须用枚举类的常量对象来指定具体的位置。如果某个注解声明时没有加Target注解,则表示所有位置都可以。

  1. 用于描述注解可以使用的位置,该注解使用ElementType枚举类型用于描述注解可以出现的位置

@Documented

用于解释新声明注解用在某个包、类、方法等上面后,当使用javadoc工具提取文档注释生成的API文档时,是否将对应的注解信息也读取到API文档。加@Documented的注解其@Retention的RetentionPolicy值必须为RUNTIME才有意义。

@Inherited

一个被@Inherited注解修饰的注解,如果该注解修饰了一个父类,则它的子类也会继承父类的注解

@Repeatable

Java 8以前的版本在使用注解时有一个限制,即相同的注解在同一位置只能使用一次,不能使用多次。Java 8引入了重复注解机制,这样相同的注解可以在同一地方使用多次,重复注解机制本身必须用@Repeatable注解标记。

Repeatable表示可以重复的含义,该注解属于JDK1.8版本的新特性,允许一个注解被使用一次或者多次。

七、反射注解

// 获取类
Class<MyClass> myClass = MyClass.class;// 判断该类上是否存在这个注解
if (myClass.isAnnotationPresent(Annotation1.class)) {// 获取指定的某个注解Annotation1 a1 = myClass.getAnnotation(Annocation1.class);// 访问注解对象中的属性值System.out.println(a1.name());
}

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

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

相关文章

基于Python的性能分析

1、什么是性能分析 字面意思就是对程序的性能,从用户角度出发就是运行的速度,占用的内存。 通过对以上情况的分析,来决定程序的哪部份能被优化。提高程序的速度以及内存的使用效率。 首先我们要弄清楚造成时间方面性能低的原因有哪些沉重的I/O操作,比如读取分析大文件,长时…

基于Azure DevOps 的 CICD 项目部署(.Net Core)

基于Azure DevOps 的 CICD 项目部署(.Net Core)使用微软的 来进行CICD 链接:https://dev.azure.com创建新项目创建项目名称选择仓库地址选择空模板创建代理池按照以下步骤把代理部署到服务器上 ![连接你的服务器创建新的文件夹 mkdir myange cd myagent可通过链接下载文件…

LeetCode 1353. Maximum Number of Events That Can Be Attended

原题链接在这里:https://leetcode.com/problems/maximum-number-of-events-that-can-be-attended/description/ 题目: You are given an array of events where events[i] = [startDayi, endDayi]. Every event i starts at startDayi and ends at endDayi. You can attend a…

PaliGemma 正式发布 — Google 最新发布的前沿开放视觉语言模型

PaliGemma 是 Google 推出的新一代视觉语言模型家族,能够接收图像与文本输入并生成文本输出。 Google 团队已推出三种类型的模型:预训练(PT)模型、混合模型和微调(FT)模型,这些模型分辨率各异,提供多种精度以便使用。 所有模型均在 Hugging Face Hub 的模型库中发布,配…

elementUI 使用 el-select 的远程搜索功能,导致数据无法回显怎么解决?

问题:解决方法: 在数据初始化的时候将获取到的数据做进一步的处理,进行本地select组件的一个添加 const labels = [];const values = [];res.data.rows.forEach((ele) => {labels.push(ele.buildName);values.push(ele.buildCode);});this.$refs.select.cachedOptions = …

基于uniapp+vue3自定义增强版table表格组件「兼容H5+小程序+App端」

vue3+uniapp多端自定义table组件|uniapp加强版综合表格组件 uv3-table:一款基于uniapp+vue3跨端自定义手机端增强版表格组件。支持固定表头/列、边框、斑马纹、单选/多选,自定义表头/表体插槽、左右固定列阴影高亮显示。支持编译兼容H5+小程序端+App端。 如下图:H5+小程序+A…

扩散模型的多元化应用:药物发现、文本生成、时间序列预测等

AlphaFold3 是 DeepMind 开发的一款蛋白质结构预测软件,它在AlphaFold2的基础上进行了改进。其中最主要的一个改进就是引入了扩散模型,这使得扩散模型不仅仅可以应用于文生图,其实扩散模型早已经在各个领域中都又所发展,今天我们就来研究一下扩散模型的多元化应用。https:/…

FFmpeg开发笔记(二十一)Windows环境给FFmpeg集成AVS3解码器

​AVS3是中国AVS工作组制定的第三代音视频编解码技术标准,也是全球首个已推出的面向8K及5G产业应用的视频编码标准。AVS工作组于2019年3月9日完成第三代AVS视频标准(AVS3)基准档次的制订工作,参考软件的测试表明,AVS3基准档次的性能比上一代标准AVS2和HEVC提升了约30%。li…

笔记3. 链表

目录链表结构单链表和双链表链表题目常用技巧题目面试题 02.06. 回文链表给定一个数,把单链表划分为左边小于,中间相等,右边大的形式138. 复制带随机指针的链表单链表相交问题补充:哈希表和有序表的简单介绍 链表结构 单链表和双链表 // 单链表 typedef struct Node {int v…

vue2中安装scss

在终端执行命令cnpm i sass sass-loader -D 注意 ::v-deep

《程序员自我修养》读书笔记

目录虚拟地址空间(虚拟内存)布局编译与链接例子源码看看obj文件的组成格式主要的段全部的段组成格式:头信息+段一些概念和命令的总结概念命令 虚拟地址空间(虚拟内存)布局bss段节省的是文件的空间,不是虚拟地址空间指令段和数据段在程序运行起来后是不变的,不可伸缩从0地…

pip 下载速度慢

1、打开文件夹,输入%APPDATA%回车,打开%APPDATA%路径,并在此路径下新建一个pip文件夹:2、在pip文件夹下,新建pip.ini文件,并将以下内容添加至pip.ini文件中:[global] timeout = 6000 index-url = http://mirrors.aliyun.com/pypi/simple/ trusted-host = mirrors.aliyun…