Cglib动态代理的底层原理

使用

老规矩,先回忆一下怎么使用cglib的动态代理

  1. 写一个方法拦截器作为回调
  2. 创建Enhancer并设置父类和回调
  3. 使用Enhancer创建代理类
public class MyMethodInterceptor implements MethodInterceptor {
   
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
   
        System.out.println("proxy前置");
        Object o1 = methodProxy.invokeSuper(o, objects);
        System.out.println("proxy后置");
        return o1;
    }
}

 @Test
    public void test(){
   
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\mini-spring-master\\src\\test\\java\\cn\\jwb5\\proxy\\cglib");
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(SayHelloImpl.class);
        enhancer.setCallback(new MyMethodInterceptor());
        SayHelloImpl sayHello = (SayHelloImpl)enhancer.create();
        sayHello.say();

    }

在这里插入图片描述

原理分析

我们通过设置系统属性DebuggingClassWriter.DEBUG_LOCATION_PROPERTY开启了cglib的debug模式,使其代理文件生成在指定目录
在这里插入图片描述
这五个文件,下面两个是库不用管,我们主要看上面三个,依次为:

  1. 代理类的FastClass
  2. 代理类
  3. 目标类的FastClass

FastClass是用来解决反射效率低下的一种方法,这里暂时先不说,后面会讲。我们先看代理类的内容(删掉了大部分其他方法,只留一个用户接口的方法举例说明,其他类似)

public class SayHelloImpl$$EnhancerByCGLIB$$7546f86a extends SayHelloImpl implements Factory {
   
    private boolean CGLIB$BOUND;
    public static Object CGLIB$FACTORY_DATA;
    private static final ThreadLocal CGLIB$THREAD_CALLBACKS;
    private static final Callback[] CGLIB$STATIC_CALLBACKS;
    private MethodInterceptor CGLIB$CALLBACK_0;
    private static Object CGLIB$CALLBACK_FILTER;
    private static final Method CGLIB$say$0$Method;
    private static final MethodProxy CGLIB$say$0$Proxy;
    private static final Object[] CGLIB$emptyArgs;
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值