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();
}
}