首页 / JAVA / java注解的底层实现
java注解的底层实现
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java注解的底层实现,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2301字,纯文字阅读大概需要4分钟。
内容图文
![java注解的底层实现](/upload/InfoBanner/zyjiaocheng/814/13c6e107168841c59193db6ab6743b6a.jpg)
原文链接:https://blog.csdn.net/feicongcong/article/details/78242358
总结: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用来说明该注解类的生命周期.
至于我们看到添加了注解的属性或方法会执行某些行为,事实上是使用了代理对象,在生成代理对象时(构造是它的事件处理类中,跑了那些方法,这其中又用到了反射技术)
所以说注解实现某些行为是基于反射技术和代理
---------------------
作者:feicongcong
来源:CSDN
原文:https://blog.csdn.net/feicongcong/article/details/78242358
版权声明:本文为博主原创文章,转载请附上博文链接!
内容总结
以上是互联网集市为您收集整理的java注解的底层实现全部内容,希望文章能够帮你解决java注解的底层实现所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。