如题,最近写代码,对看惯了的注解产生了好奇,想研究下这个具体的实现方式,但是好像本人比较笨拙,看了好多前辈的写的总结,自己尝试着去发现一点什么,但是还是停留在基本的面面上。 现在的问题是,在 jvm 层面, vm 是如何调用 Proxy ,如何 reflect 到 Annotation 上的,具体的实现方式是什么
1
woai110120130 2017-03-02 21:59:33 +08:00
Annotation 有两种使用方式,一种是运行时使用的,也就是通过反射,具体方法不记得了,看一些 Method Field Class 就清清楚了,另外一种是通过编译期的注解处理器, jdt 和 javac 都提供了相应的处理函数, Proxy 可以参考下张校祥老师的视频,有一节讲动态代理的,比较不错。 jvm 层面如何实现的?有相应的指令吧,怎么实现的无所谓吧,就是解释执行实现的。
|
2
lifeand OP @woai110120130 那我想知道 jvm 层面是如何执行的呢,如何调用 proxy😳
|
3
tianshuang 2017-03-02 22:27:50 +08:00
|
4
HarveyDent 2017-03-02 22:27:54 +08:00
代理的实现一般都是生成了一个类,这个类实现了被代理接口的所有方法,然后所有这些方法都调用代理类的 intercept 方法,你自己实现 intercept ,做一些操作,然后反射到被代理的对象。
|
5
lifeand OP @tianshuang 只是说明了 annocation 的用途,并没有解释 annocation 是在 jdk 下如何执行的😓
|
6
lifeand OP @HarveyDent 这个是 Cglib 实现动态代理的方法
|
7
lytofb 2017-03-03 11:59:07 +08:00
aspectj —— cglib —— asm —— attach/instrument
|
9
gexyuzz 2017-04-09 18:58:56 +08:00
其实 javac 是 jdk 代理, cglib,asm 之类的字节码类库的祖宗,其实就是根据 class 文件的格式规范去拼装字节码从而生成了代理类的字节码 byte[]数组。得到了字节码随便你搞....
|