java注解的底层实现

总结:Java的annotation没有行为,只能有数据。让其实现某些行为必须有实例(代理对象),再用反射技术执行某些行为

https://www.zhihu.com/question/24401191

注解是什么,其实注解本质是一个接口interface

从反编译后的信息中可以看出,注解就是一个继承自`java.lang.annotation.Annotation`的接口

Annotation是被动的元数据,永远不会有主动行为。但凡Annotation起作用的场合都是有一个执行机制/调用者通过反射获得了这个元数据然后根据它采取行动

定义:注解(Annotation),也叫元数据。一种代码级别的说明。annotation是一种在类、类型、属性、参数、局部变量、方法、构造方法、包、annotation本身等上面的一个附属品

Java的annotation没有行为,只能有数据,实际上就是一组键值对而已。通过解析(parse)Class文件就能把一个annotation需要的键值对都找出来。
于是问题就变成:
·有一个接口
·有一组键值对,它里面的数组能支持前面那个接口的功能
怎样才能把这个接口和这个map结合起来呢?
注解是个接口,那么在运行期间获取的那些实例是什么?

OpenJDK 6里,sun.reflect.annotation.AnnotationParser的第254行:
(jdk8 195行)

public static Annotation annotationForMap(final Class<? extends Annotation> var0, final Map<String, Object> var1) {
        return (Annotation)AccessController.doPrivileged(new PrivilegedAction() {
            public Annotation run() {
                return (Annotation)Proxy.newProxyInstance(var0.getClassLoader(), new Class[]{var0}, new AnnotationInvocationHandler(var0, var1));
            }
        });
    }

这个AnnotationInvocationHandler是一个实现了InvocationHandler的类,所以很明显这个其实就是动态地理了。
嗯,注解本质是个接口,然后运行期间获取到的到底是什么,就是个接口的代理对象。

然后说 @xxx 就能自动运行某个方法之类的具体实现,其实这类东西都依赖于一个容器或者工厂的东西,具体请看怎样理解 java 注解和运用注解编程?

https://www.zhihu.com/question/47449512/answer/106034220

创建一个注解,用关键字@interface来声明,这是一个注解类.@Target来声明注解目标,
@Retention用来说明该注解类的生命周期.

至于我们看到添加了注解的属性或方法会执行某些行为,事实上是使用了代理对象,在生成代理对象时(构造是它的事件处理类中,跑了那些方法,这其中又用到了反射技术)

所以说注解实现某些行为是基于反射技术和代理




  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值