在看这篇文章之前你有必要读一下我上一篇Jdk动态代理,里面从源码刨析,看完再回来看这个事半功倍
https://blog.csdn.net/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类