概述
cglib是一个优秀的动态代理框架,它底层通过asm在内存中动态地生成被代理类的子类,我们先来看一下cglib框架的架构。
动态代理?jdk不是给我们提供了吗?为什么还需要cglib? 一个重要的原因是jdk动态代理不能完成对没有实现接口的类的代理,但cglib可以,本质上,对于需要被代理的类,它只是动态生成一个子类来覆盖非final方法,同时回调自定义的拦截器。
cglib的核心类:
Enhancer: 主要的增强类
MethodProxy JDK的java.lang.reflect.Method类的代理类,可以方便地实现对源对象方法的调用。
MethodInterceptor:主要的方法拦截类,它是Callback接口的子接口,这个接口只定义了一个方法,public Object intercept(Object object, java.lang.reflect.Method method,Object[] args, MethodProxy proxy) throws Throwable;当调用代理方法时,它会先调用该方法,再调用被代理对象的方法,其第一个参数为代理对象,第二个、第三个参数分别为被拦截的方法以及方法参数。
MethodInterceptor满足了所有的代理需求,但对于某些特定场景它使用起来不太方便,为了提高性能和方便,cglib提供了一些特殊的回调类型。比如NoOp直接透传到父类的方法实现。
这里笔者有疑惑的是idea下debug和run出现不同的结果,debug下的结果如下
网友评论