CGLIB(Code Generation Library)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,
cglib 实现动态代理的底层原理是字节码生成技术,具体就是使用字节码生成技术生成一个目标类的子类,然后在这个子类中进行方法重写,并在重写的方法中进行拦截,实现代理对象的相关功能。
需要引入cglib包(2021-8)
<!-- cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
Enhancer(net.sf.cglib.proxy包下)是一个非常重要的类,它允许为非接口类型创建一个JAVA代理,Enhancer动态的创建给定类的子类并且拦截代理类的所有的方法,和JDK动态代理不一样的是不管是接口还是类它都能正常工作。
Callback接口:在cglib包中是一个很关键的接口,所有被Enhancer类调用的回调(callback)接口都要继承这个接口。
MethodInterceptor接口:它可以实现方法拦截的功能,也是是通用的回调(callback)类型,它经常被AOP用来实现拦截(intercept)方法的调用;
MethodInterceptor接口的唯一抽象方法如下:
public Object intercept(Object obj, java.lang.reflect.Method method, Object[] args,
MethodProxy proxy) throws Throwable;
参数如下:
1)obj表示增强的对象,即实现这个接口类的一个对象;
2)method表示要被拦截的方法;
3)args表示要被拦截方法的参数;
4)proxy表示要触发父类的方法对象;
示例:
用于生成动态代理
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibProxy implements MethodInterceptor {
private Enhancer enhancer = new Enhancer();
//获取代理对象
public Object getProxy(Class clazz) {
enhancer.setSuperclass(clazz); //代理类的父类
enhancer.setCallback(this); // 添加Callback对象
return enhancer.create(); // 通过cglib动态创建子类实例并返回
}
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("before do...");
//调用父类的方法
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("after do...");
return result;
}
}
被代理的类
public class CglibSubject {
public String method(String str){
System.out.println(str);
return "CglibSubject:" + str;
}
}
测试:
public class Test {
public static void main(String[] args) {
CglibProxy proxyDemo = new CglibProxy();
CglibSubject mainDemo = (CglibSubject)proxyDemo.getProxy(CglibSubject.class);
String result = mainDemo.method("test");
System.out.println(result);
}
}
执行结果如下:
before do...
test
after do...
CglibSubject:test