lifeand
V2EX  ›  Java

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

  •  
  •   lifeand · Mar 2, 2017 · 4495 views
    This topic created in 3534 days ago, the information mentioned may be changed or developed.

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

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