如题,最近写代码,对看惯了的注解产生了好奇,想研究下这个具体的实现方式,但是好像本人比较笨拙,看了好多前辈的写的总结,自己尝试着去发现一点什么,但是还是停留在基本的面面上。 现在的问题是,在 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 argos 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[]数组。得到了字节码随便你搞.... |