CGLIB 是非常流行的实现,用于实现代理机制。我很想知道,要代理一个特定的类,CGLIB 会创建其子类的内存实现,还是创建物理字节码然后实例化该类?
如果它在内存实现中创建,那么这样做会带来多少开销。我试图在 CGLIB 文档中找到此详细信息,但它没有指定或可能已被我跳过。
对于 javaassist 库,可能会问同样的问题。
CGLIB 是非常流行的实现,用于实现代理机制。我很想知道,要代理一个特定的类,CGLIB 会创建其子类的内存实现,还是创建物理字节码然后实例化该类?
如果它在内存实现中创建,那么这样做会带来多少开销。我试图在 CGLIB 文档中找到此详细信息,但它没有指定或可能已被我跳过。
对于 javaassist 库,可能会问同样的问题。
嗯,首先,cglib 提供了完全独立的完全不同的类。
但是,据我所知,截至今天,cglib 通过使用 ASM 读取类的字节码并通过 ASM ClassVisitor 等“动态”操作它来在内存中创建类。也就是说,cglib 使用 ASM 的访问者API 而不是它的内存密集型树 API。然后直接加载生成的类。这是关于它可以通过字节检测获得多快。
基本上,cglib 可以做 ASM 可以做的所有事情。ASM 有很好的记录:http: //download.forge.objectweb.org/asm/asm4-guide.pdf
如果你有兴趣,我在这里写了一篇关于cglib的总结:http: //mydailyjava.blogspot.no/2013/11/cglib-missing-manual.html