【学习总结】注解和元注解

简介: 【学习总结】注解和元注解

一、注解

注解:可以看作是对 一个 类/方法 的一个扩展的模版,每个 类/方法 按照注解类中的规则,来为 类/方法 注解不同的参数,在用到的地方可以得到不同的 类/方法 中注解的各种参数与值。

1、注解与XML区别

注解:是一种分散式的元数据,与源代码紧绑定

XML:是一种集中式的元数据,与源代码无绑定

2、注解的用途

  • 生成文档:通过代码里标识的元数据生成javadoc文档
  • 编译检查:通过代码里标识的元数据让编译器在编译期间进行检查验证
  • 编译时动态处理:编译时通过代码里标识的元数据动态处理,例如动态生成代码
  • 运行时动态处理:运行时通过代码里标识的元数据动态处理,例如使用反射注入实例

3、注解的三种分类

  • Java自带的标准注解
  • 元注解(元注解是用于定义注解的注解)
  • 自定义注解

二、什么是元注解

元注解是可以注解上注解上的注解,也可以说元注解是一种基本注解,但是元注解可以应用到其他注解上。而元注解的作用和目的是为了给普通的标签进行解释说明的。

1、元注解有几种?

1、@Retention存活时间

@Retention去给一张标签解释时,它指定了这张标签张贴的时间,相当于给一张标签上面盖了一张时间戳,时间戳指明了标签张贴的时间周期

取值如下:

  • RetentionPolicy.SOURCE:注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视
  • RetentionPolicy.CLASS:注解只被保留到编译进行的时候,它并不会被加载到JVM中
  • RetentionPolicy.RUNTIME:注解可以保留到程序运行的时候,会被加载进入到JVM中,所以程序运行时可以获取到

2、@Target使用范围

指定了注解运用到的地方。类比作标签,原本标签是想贴到什么地方就贴到什么地方,但是有了@Target的存在,它张贴的地方就非常具体了,比如只能张贴到方法上、类上、方法参数上等

取值:

  • ElementType.ANNOTATION_TYPE :可以给一个注解进行注解
  • ElementType.CONSTRUCTOR :可以给构造方法进行注解
  • ElementType.FIELD :可以给属性进行注解
  • ElementType.LOCAL_VARIABLE :可以给局部变量进行注解
  • ElementType.METHOD: 可以给方法进行注解
  • ElementType.PACKAGE: 可以给一个包进行注解
  • ElementType.PARAMETER :可以给一个方法内的参数进行注解
  • ElementType.TYPE :可以给一个类型进行注解,比如类、接口、枚举

3、@Document保存到javadoc

@Documented 和文档有关系,能够将注解中的元素包含到Javadoc中

4、@Inherited注解继承

Inherited是继承的意思,但是它并不是说注解本身可以继承,而是说如果一个超类被@Inherited注解过的注解进行注解的话(注解了B注解,B在注解其他),那么它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解

@Inherited

@Retention(RetentionPolicy.RUNTIME)

@interface Test {}


@Test

public class A {}


public class B extends A {}


三、如何实现的注解


四、问提:

注解的生命周期?

有三种:源文件阶段、字节码文件阶段、内存字节码阶段

1、注解被保留到源文件阶段

当javac把.java源文件编译成.class时,就将相应的注解去掉,这种注解的生命周期就维持到源文件阶段

2、注解被保留到字节码(.class)文件阶段(编译时)

在JVM通过ClassLoader向内存中加载字节码文件时,JVM会去掉相应的注解。这种注解的生命周期就维持到字节码文件阶段

3、注解被保留到内存中的字节码阶段(运行时)

JVM运行内存的i字节码时,仍然可能会保留并且执行的某些注解。这种注解的生命周期就维持到内存字节码阶段

三个阶段简单表示为:java源文件-->class文件-->内存中的字节码


五、自定义注解实现过程

1、定义自定义注解

2、在定义的自定义注解上方添加注解

3、使用注解

4、编写自定义注解解释器


相关文章
|
Cloud Native 关系型数据库 数据库
云原生之使用Docker部署Mariadb数据库
云原生之使用Docker部署Mariadb数据库
936 1
云原生之使用Docker部署Mariadb数据库
|
8月前
|
缓存 Ubuntu Linux
Docker Buildx 简介与安装指南
Docker Buildx 是一个强大的工具,提供了多架构构建、并行构建和高级缓存管理等功能。通过正确安装和配置 Buildx,可以显著提升 Docker 镜像的构建效率和灵活性。希望本文能帮助你更好地理解和使用 Docker Buildx,以提高开发和部署的效率。
4087 16
|
机器学习/深度学习 编解码 人工智能
2024年2月深度学习的论文推荐
我们这篇文章将推荐2月份发布的10篇深度学习的论文
505 1
|
数据采集 搜索推荐 安全
智慧城市的交通管理大数据模型
智慧城市交通管理系统借助大数据模型,通过全面收集交通数据(如监控、GPS、公共交通信息等),进行数据清洗和预处理,利用Python的Pandas进行数据管理。通过ARIMA等模型分析,预测交通流量、识别交通模式,支持智能信号控制、预测性维护和事件响应。这种集成分析与决策支持系统提升城市交通效率,确保出行安全,预示着未来交通管理的智能化和个性化趋势。【6月更文挑战第23天】
1394 10
|
关系型数据库 MySQL Linux
Linux_Centos7在安装Mysql常见错误
Linux_Centos7在安装Mysql常见错误依赖时失败 问题一:Centos7在安装Mysql依赖(libs)或客户端(client)时失败 问题二:Centos7在安装Mysql服务器(server)时失败
1713 1
|
负载均衡 API 数据格式
RPC和HTTP的区别?
RPC和HTTP的区别?
934 0
|
机器学习/深度学习 运维 算法
「AIGC算法」K-means聚类模型
**K-means聚类模型概览:** - 是无监督学习算法,用于数据集自动分组。 - 算法步骤:初始化质心,分配数据点,更新质心,迭代直至收敛。 - 关键点包括K的选择、初始化方法、收敛性和性能度量。 - 优点是简单快速,适合大样本,但对初始点敏感,需预设K值,且仅适于球形簇。 - 应用场景包括图像分割、市场分析、异常检测等。 - 示例展示了使用scikit-learn对Iris数据集和自定义CSV数据进行聚类。
578 0
「AIGC算法」K-means聚类模型
聊天框(番外篇)—如何实现@功能的整体删除
上一篇文章中,我们已经初步实现了聊天输入框,但其@功能是不完善的,例如无法整体删除、无法获取除用户名以外的数据(假设用户名不是唯一的)。有问题就要想办法解决,在网上百度了一圈后,倒是有一些收获。本文就着重解决@的整体删除以及获取额外数据。
1454 0
聊天框(番外篇)—如何实现@功能的整体删除
|
编解码 测试技术 数据库
图书馆管理系统系统分析与设计(上)
图书馆管理系统系统分析与设计(上)
744 0
|
分布式计算 资源调度 Hadoop
Hadoop【基础知识 03+04】【Hadoop集群资源管理器yarn】(图片来源于网络)(hadoop fs + hadoop dfs + hdfs dfs 使用举例)
【4月更文挑战第5天】Hadoop【基础知识 03】【Hadoop集群资源管理器yarn】(图片来源于网络)Hadoop【基础知识 04】【HDFS常用shell命令】(hadoop fs + hadoop dfs + hdfs dfs 使用举例)
319 9