原理
直接看源码有点奢侈, 这里直接把结论给出来:
注解 @interface
是一个实现了Annotation接口的接口, 在调用 getDeclaredAnnotations()
方法的时候, 返回一个代理 $Proxy
对象, 这个是使用 jdk 动态代理创建, 使用 Proxy
的 newProxyInstance
方法时候, 传入接口和 InvocationHandler
的一个实例(也就是 AnotationInvocationHandler
), 最后返回一个代理实例.
期间, 在创建代理对象之前, 解析注解时候从该注解类的常量池中取出注解的信息, 包括之前写到注解中的参数, 然后将这些信息在创建 AnnotationInvocationHandler
时候, 传入进去作为构造函数的参数。
当调用该代理实例的获取值的方法时, 就会调用执行 AnotationInvocationHandler
里面的逻辑, 将之前存入的注解信息取出来.
FROM: https://blog.csdn.net/qq_20009015/article/details/106038023
源码探索入口
- 实现一个注解, 并在某个类上声明, 通过编译获取这个类的字节码, 看看这个类中的注解信息
- 看下类的
getDeclaredAnnotation()
方法的实现 - 本质上还是通过动态代理生成了一个代理对象, 返回注解上的信息
文章评论