在看这篇文章之前你有必要读一下我上一篇Jdk动态代理,里面从源码刨析,看完再回来看这个事半功倍
https://blog.youkuaiyun.com/fly19920602/article/details/108311237
先准备演示代码
项目结构
一个被代理类
/** * Created by lijinquan on 2020/9/3. */ public class Presion { public void move(){ System.out.println("上班写代码!"); } }
一个实现拦截器类
/** * Created by lijinquan on 2020/9/3. */ public class WorkTimeInterceptor implements MethodInterceptor { @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("name : " + method.getName() + " start ..."); Object result = null; result = methodProxy.invokeSuper(o, objects); System.out.println("name : " + method.getName() + " end ..."); return result; } }
一个测试类
/** * Created by lijinquan on 2020/9/3. */ public class Main { public static void main(String[] args) { Enhancer enhancer=new Enhancer(); enhancer.setSuperclass(Presion.class); enhancer.setCallback(new WorkTimeInterceptor()); Presion presion =(Presion) enhancer.create(); presion.move(); } }
运行测试类
以上就是一个Cglib代理的一个应用
这篇我就不带着看源码了,我写的jdk动态代理我花了几个下班的夜晚整理出来的,希望你看到能过去读读,刷新你对动态代理的认知
其实这个跟jdk动态代理有相似之处,也有差别,更有自身的缺点
Cglib代理应用起来就几行代码,也不需要被代理类去实现接口,而jdk需要被代理类实现接口
Cglib实现的拦截接口代码应该可以看出来,跟jdk的差不多,而且底层操作二进制也是asm,spring用的也是asm
缺点:不能代理final类