Cglib ——动态代理——笔记整理

简单介绍一下:

转载:这个博客 介绍 生成的代理类 介绍的挺详细的 :博客传送门

我的测试代码

流程:(这也是比jdk 快的原因吧)

使用Asm字节码生成代理类(class 文件),读取class文件到内存中,采用FastClass索引执行方法,

1、先查看一下 生成的代理 中的几个方法(动态生成三个代理类)

System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\workIDEA\\gitWork\\myProxy\\code")
FastClass 索引类
/*
    TestServiceImpl$$EnhancerByCGLIB$$efaddd0d$$FastClassByCGLIB$$4a929a23.class
    fastClass 代码片段,
*/
/**
    根据hashCode 获取下标,
    这个方法会  返回 目标类(TestServiceImpl) 中的所有方法 的下标index
*/
public int getIndex(String str, Class[] clsArr) {
        switch (str.hashCode()) {
            case -2072611921:
                if (str.equals("saveTest")) {
                    switch (clsArr.length) {
                        case 1:
                            if (clsArr[0].getName().equals("java.lang.String")) {
                                return 8;
                            }
                            break;
                        default:
                            break;
                    }
                }
                break;


/**
    invoke 方法
    i:下标
    ojb:代理对象
    objArr:方法参数
*/
    public Object invoke(int i, Object obj, Object[] objArr) throws InvocationTargetException {
InvocationTargetException invocationTargetException;
        efaddd0d efaddd0d = (efaddd0d) obj;
        switch (i) {
            case 0:
                try {
                    return new Boolean(efaddd0d.equals(objArr[0]));
                } catch (Throwable th) {
                    invocationTargetException = new InvocationTargetException(th);
                }
            case 8:
                //获取代理对象
                return efaddd0d.saveTest((String) objArr[0]);

代理类:

TestServiceImpl$$EnhancerByCGLI
/**
    代理类 代码片段
*/
public class TestServiceImpl$$EnhancerByCGLIB$$efaddd0d extends TestServiceImpl implements Factory {
    private static final Method CGLIB$saveTest$0$Method = null;  //代理类 目标方法
    private static final MethodProxy CGLIB$saveTest$0$Proxy = null; // 代理 方法

/*
    生成的代理方法
*/
    final String CGLIB$saveTest$0(String str) {
        return super.saveTest(str); // 这里就走到了 TestServiceImpl  中的方法了
    }
目标类的 fastclass  TestServiceImpl$$FastClassByCGLIB$$ad7a9bfb 

最后 断点跑一下 看看

public Object invokeSuper(Object obj, Object[] args) throws Throwable {
        try {
            init();
            FastClassInfo fci = fastClassInfo;
            return fci.f2.invoke(fci.i2, obj, args);//调用 invoke 方法,然后就结束了
        } catch (InvocationTargetException e) {
            throw e.getTargetException();
        }
    }



init(); 方法:

  synchronized (initLock)
            {
                if (fastClassInfo == null)
                {
                    CreateInfo ci = createInfo;

                    FastClassInfo fci = new FastClassInfo();
                    fci.f1 = helper(ci, ci.c1);
                    fci.f2 = helper(ci, ci.c2);
                    fci.i1 = fci.f1.getIndex(sig1);
                    fci.i2 = fci.f2.getIndex(sig2);
                    fastClassInfo = fci;
                    createInfo = null;
                }
            }
        }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值