V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lifeand
V2EX  ›  Java

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

  •  
  •   lifeand · 2017-03-02 21:53:50 +08:00 · 3039 次点击
    这是一个创建于 2851 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    10 条回复    2017-04-11 16:52:58 +08:00
    woai110120130
        1
    woai110120130  
       2017-03-02 21:59:33 +08:00
    Annotation 有两种使用方式,一种是运行时使用的,也就是通过反射,具体方法不记得了,看一些 Method Field Class 就清清楚了,另外一种是通过编译期的注解处理器, jdt 和 javac 都提供了相应的处理函数, Proxy 可以参考下张校祥老师的视频,有一节讲动态代理的,比较不错。 jvm 层面如何实现的?有相应的指令吧,怎么实现的无所谓吧,就是解释执行实现的。
    lifeand
        2
    lifeand  
    OP
       2017-03-02 22:16:22 +08:00
    @woai110120130 那我想知道 jvm 层面是如何执行的呢,如何调用 proxy😳
    tianshuang
        3
    tianshuang  
       2017-03-02 22:27:50 +08:00
    HarveyDent
        4
    HarveyDent  
       2017-03-02 22:27:54 +08:00
    代理的实现一般都是生成了一个类,这个类实现了被代理接口的所有方法,然后所有这些方法都调用代理类的 intercept 方法,你自己实现 intercept ,做一些操作,然后反射到被代理的对象。
    lifeand
        5
    lifeand  
    OP
       2017-03-02 22:53:48 +08:00
    @tianshuang 只是说明了 annocation 的用途,并没有解释 annocation 是在 jdk 下如何执行的😓
    lifeand
        6
    lifeand  
    OP
       2017-03-02 23:06:44 +08:00
    @HarveyDent 这个是 Cglib 实现动态代理的方法
    lytofb
        7
    lytofb  
       2017-03-03 11:59:07 +08:00
    aspectj —— cglib —— asm —— attach/instrument
    lifeand
        8
    lifeand  
    OP
       2017-03-03 21:51:11 +08:00
    @lytofb 能不能详细一点☁️
    gexyuzz
        9
    gexyuzz  
       2017-04-09 18:58:56 +08:00
    其实 javac 是 jdk 代理, cglib,asm 之类的字节码类库的祖宗,其实就是根据 class 文件的格式规范去拼装字节码从而生成了代理类的字节码 byte[]数组。得到了字节码随便你搞....
    lifeand
        10
    lifeand  
    OP
       2017-04-11 16:52:58 +08:00
    @gexyuzz thx ,已在学习之中
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2800 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:59 · PVG 19:59 · LAX 03:59 · JFK 06:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.