Java中注解的本质

2022年 3月 30日 51点热度 0人点赞

原理

直接看源码有点奢侈, 这里直接把结论给出来:

注解 @interface 是一个实现了Annotation接口的接口, 在调用 getDeclaredAnnotations() 方法的时候, 返回一个代理 $Proxy 对象, 这个是使用 jdk 动态代理创建, 使用 ProxynewProxyInstance 方法时候, 传入接口和 InvocationHandler 的一个实例(也就是 AnotationInvocationHandler), 最后返回一个代理实例.

期间, 在创建代理对象之前, 解析注解时候从该注解类的常量池中取出注解的信息, 包括之前写到注解中的参数, 然后将这些信息在创建 AnnotationInvocationHandler 时候, 传入进去作为构造函数的参数。

当调用该代理实例的获取值的方法时, 就会调用执行 AnotationInvocationHandler 里面的逻辑, 将之前存入的注解信息取出来.

FROM: https://blog.csdn.net/qq_20009015/article/details/106038023

源码探索入口

  1. 实现一个注解, 并在某个类上声明, 通过编译获取这个类的字节码, 看看这个类中的注解信息
  2. 看下类的 getDeclaredAnnotation() 方法的实现
  3. 本质上还是通过动态代理生成了一个代理对象, 返回注解上的信息

rainbow

这个人很懒,什么都没留下

文章评论