CGLIB 介绍
CGLib (Code Generation Library) 是一个强大的,高性能,高质量的Code生成类库。
CGLib 可以在运行时扩展Java类与实现Java接口。CGLib 比 Java 的 java.lang.reflect.Proxy 类更强的在于它不仅可以接管接口实现类的方法,还可以接管普通类的方法.
CGLib 的底层是Java字节码操作框架 —— ASM。
cglib 组织架构图
cglib是针对类来实现代理的,原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
代理模式
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
按照代理的创建时期,代理类可以分为两种。
静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
动态代理:在程序运行时,运用反射机制动态创建而成。
Code Demo:
代理类:
public class CglibProxy implements MethodInterceptor { /** * 根据class对象创建该对象的代理对象 * 1、设置父类;2、设置回调 * 本质:动态创建了一个class对象的子类 */ public <T> T getProxy(Class<T> cls) { return (T) Enhancer.create(cls, this); } // 回调方法 public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { before(); Object result = proxy.invokeSuper(obj, args); after(); return result; } private void after() { System.out.println("after proc"); } private void before() { System.out.println("before proc"); } }
Enhancer的create方法:
public static Object create(Class type, Callback callback) { Enhancer e = new Enhancer(); e.setSuperclass(type); e.setCallback(callback); return e.create(); }
通过create方法可知,cglib通过把要代理的类作为父类,生成其子类来动态生成代理类。
普通Java类(没实现任何接口)
public class Lion{ public void run() { System.out.println("草原之王——狮子在跑"); } }
测试类
public class AppTest { @Test public void testCglib() { CglibProxy cglibProxy = new CglibProxy(); Lion lionProxy = cglibProxy.getProxy(Lion.class); lionProxy.run(); } }