注解的原理

简介: 前面介绍了如何使用Java内置的注解以及如何自定义一个注解,接下去看看注解实现的原理,看看在Java的大体系下面是如何对注解的支持的。

前面介绍了如何使用Java内置的注解以及如何自定义一个注解,接下去看看注解实现的原理,看看在Java的大体系下面是如何对注解的支持的。还是回到上面自定义注解的例子,对于注解Test,如下,如果对AnnotationTest类进行注解,则运行时可以通过AnnotationTest.class.getAnnotation(Test.class)获取注解声明的值,从上面的句子就可以看出,它是从class结构中获取出Test注解的,所以肯定是在某个时候注解被加入到class结构中去了。

@Test("test")
public class AnnotationTest {
public void test(){
}
}

从java源码到class字节码是由编译器完成的,编译器会对java源码进行解析并生成class文件,而注解也是在编译时由编译器进行处理,编译器会对注解符号处理并附加到class结构中,根据jvm规范,class文件结构是严格有序的格式,唯一可以附加信息到class结构中的方式就是保存到class结构的attributes属性中。我们知道对于类、字段、方法,在class结构中都有自己特定的表结构,而且各自都有自己的属性,而对于注解,作用的范围也可以不同,可以作用在类上,也可以作用在字段或方法上,这时编译器会对应将注解信息存放到类、字段、方法自己的属性上。

在我们的AnnotationTest类被编译后,在对应的AnnotationTest.class文件中会包含一个RuntimeVisibleAnnotations属性,由于这个注解是作用在类上,所以此属性被添加到类的属性集上。即Test注解的键值对value=test会被记录起来。而当JVM加载AnnotationTest.class文件字节码时,就会将RuntimeVisibleAnnotations属性值保存到AnnotationTest的Class对象中,于是就可以通过AnnotationTest.class.getAnnotation(Test.class)获取到Test注解对象,进而再通过Test注解对象获取到Test里面的属性值。

这里可能会有疑问,Test注解对象是什么?其实注解被编译后的本质就是一个继承Annotation接口的接口,所以@Test其实就是“public interface Test extends Annotation”,当我们通过AnnotationTest.class.getAnnotation(Test.class)调用时,JDK会通过动态代理生成一个实现了Test接口的对象,并把将RuntimeVisibleAnnotations属性值设置进此对象中,此对象即为Test注解对象,通过它的value()方法就可以获取到注解值。
Java注解实现机制的整个过程如上面所示,它的实现需要编译器和JVM一起配合。


========广告时间========

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。

为什么写《Tomcat内核设计剖析》

=========================

欢迎关注:

这里写图片描述

目录
相关文章
|
存储 Java 关系型数据库
家政服务管理平台
家政服务管理平台
|
机器学习/深度学习 人工智能 自然语言处理
电子商务和网络安全
【5月更文挑战第10天】电子商务和网络安全
613 2
|
API 开发工具 Android开发
Android源码下载
Android源码下载
2206 0
|
网络协议 Linux
iperf 工具使用总结
iperf 工具使用总结
1241 0
|
机器学习/深度学习 缓存 PyTorch
异步数据加载技巧:实现 DataLoader 的最佳实践
【8月更文第29天】在深度学习中,数据加载是整个训练流程中的一个关键步骤。为了最大化硬件资源的利用率并提高训练效率,使用高效的数据加载策略变得尤为重要。本文将探讨如何通过异步加载和多线程/多进程技术来优化 DataLoader 的性能。
2189 1
|
Python
模块
【7月更文挑战第23天】模块。
235 4
|
XML SQL JavaScript
微信扫码登陆网站类似 58同城(基于微信开发生成带参数的二维码的讲解)
微信扫码登陆网站类似 58同城(基于微信开发生成带参数的二维码的讲解)
412 0
|
区块链
“我不碰比特币,我只做区块链”
你可以在世界上几乎所有的银行都听到这些话。这是错的。讽刺的是, 比特币区块链是金融机构接触最多的区块链。每天, 银行都会在比特币交易所和商户处理器之间进行数百万美元的交易。一些银行已经为这些业务的发布提供了控制和流程, 其他银行只是让零售客户直接从他们的银行账户购买和销售比特币。
1484 0
|
17小时前
|
云安全 人工智能 自然语言处理