代理5 cglib 概述

背景

对于没有实现接口的类,不能使用动态代理Proxy。
而CGLIB则可以实现对类的动态代理.
使用cglib[Code Generation Library]实现动态代理,并不要求委托类必须实现接口,底层采用asm字节码生成框架生成代理类的字节码

原理:

对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。 
在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。它比使用java反射的JDK动态代理要快。

底层:使用字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。

与动态代理的比较

CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少,但是CGLib在创建代理对象时所花费的时间却比JDK多得多,所以对于单例的对象,因为无需频繁创建对象,用CGLib合适,反之,使用JDK方式要更为合适一些。

如何生成一个class文件:
jdk和cglib生成字节码文件分别用的sun的ProxyGenerator和开源项目ASM字节码框架。

jdk采用反射机制调用委托类的方法,cglib采用类似索引的方式直接调用委托类方法;

缺点

CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理。

refer

回调过滤器以及延迟加载
http://blog.csdn.net/zghwaicsdn/article/details/50957474

CGLIB中BeanCopier源码实现
http://www.jianshu.com/p/f8b892e08d26

demo
http://www.cnblogs.com/icejoywoo/archive/2011/06/05/2072970.html

全面的源码分析,一系列
http://www.cnblogs.com/cruze/p/3843996.html

大概的架构介绍
http://www.cnblogs.com/davidwang456/p/5654097.html

jdk动态代理与cglib区别
http://www.cnblogs.com/chinajava/p/5880887.html

javadoc
http://cglib.sourceforge.net/apidocs/
http://javadox.com/cglib/cglib/2.2/net/sf/cglib/proxy/Enhancer.html

JDK 和CGLIB、Javassist、ASM
http://www.voidcn.com/blog/chenchaofuck1/article/p-6066671.html
http://www.voidcn.com/blog/zmx729618/article/p-5987634.html

cglib手册
https://dzone.com/articles/cglib-missing-manual

你可能感兴趣的:(代理5 cglib 概述)