由注解引出的一个动态代理和反射的问题

2017-03-02 21:53:50 +08:00
 lifeand

如题,最近写代码,对看惯了的注解产生了好奇,想研究下这个具体的实现方式,但是好像本人比较笨拙,看了好多前辈的写的总结,自己尝试着去发现一点什么,但是还是停留在基本的面面上。 现在的问题是,在 jvm 层面, vm 是如何调用 Proxy ,如何 reflect 到 Annotation 上的,具体的实现方式是什么

3007 次点击
所在节点    Java
10 条回复
woai110120130
2017-03-02 21:59:33 +08:00
Annotation 有两种使用方式,一种是运行时使用的,也就是通过反射,具体方法不记得了,看一些 Method Field Class 就清清楚了,另外一种是通过编译期的注解处理器, jdt 和 javac 都提供了相应的处理函数, Proxy 可以参考下张校祥老师的视频,有一节讲动态代理的,比较不错。 jvm 层面如何实现的?有相应的指令吧,怎么实现的无所谓吧,就是解释执行实现的。
lifeand
2017-03-02 22:16:22 +08:00
@woai110120130 那我想知道 jvm 层面是如何执行的呢,如何调用 proxy😳
tianshuang
2017-03-02 22:27:50 +08:00
HarveyDent
2017-03-02 22:27:54 +08:00
代理的实现一般都是生成了一个类,这个类实现了被代理接口的所有方法,然后所有这些方法都调用代理类的 intercept 方法,你自己实现 intercept ,做一些操作,然后反射到被代理的对象。
lifeand
2017-03-02 22:53:48 +08:00
@tianshuang 只是说明了 annocation 的用途,并没有解释 annocation 是在 jdk 下如何执行的😓
lifeand
2017-03-02 23:06:44 +08:00
@HarveyDent 这个是 Cglib 实现动态代理的方法
lytofb
2017-03-03 11:59:07 +08:00
aspectj —— cglib —— asm —— attach/instrument
lifeand
2017-03-03 21:51:11 +08:00
@lytofb 能不能详细一点☁️
gexyuzz
2017-04-09 18:58:56 +08:00
其实 javac 是 jdk 代理, cglib,asm 之类的字节码类库的祖宗,其实就是根据 class 文件的格式规范去拼装字节码从而生成了代理类的字节码 byte[]数组。得到了字节码随便你搞....
lifeand
2017-04-11 16:52:58 +08:00
@gexyuzz thx ,已在学习之中

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/344454

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX