美文网首页
Cglib FastClass例子

Cglib FastClass例子

作者: huiwq1990 | 来源:发表于2017-06-27 15:52 被阅读0次
    image.png

    DemoService 原始类
    DemoService$$FastClassByCGLIB$$3215ecb4 原始类的FastClass

    DemoService$$EnhancerByCGLIB$$c23dc77c DemoService的代理类
    DemoService$$EnhancerByCGLIB$$c23dc77c$$FastClassByCGLIB$$396d31d2 代理类的FastClass

       static void CGLIB$STATICHOOK1() {
            CGLIB$THREAD_CALLBACKS = new ThreadLocal();
            CGLIB$emptyArgs = new Object[0];
    
            // 生成的代理类
            Class class_ = Class.forName("com.zhiyin.cglib.cando.DemoService$$EnhancerByCGLIB$$c23dc77c");
            Class class_2 = Class.forName("java.lang.Object");
            Method[] arrmethod = ReflectUtils.findMethods((String[])new String[]{"equals", "(Ljava/lang/Object;)Z", "toString", "()Ljava/lang/String;", "hashCode", "()I", "clone", "()Ljava/lang/Object;"}, (Method[])class_2.getDeclaredMethods());
            CGLIB$equals$1$Method = arrmethod[0];
            CGLIB$equals$1$Proxy = MethodProxy.create(class_2, class_, (String)"(Ljava/lang/Object;)Z", (String)"equals", (String)"CGLIB$equals$1");
            CGLIB$toString$2$Method = arrmethod[1];
            CGLIB$toString$2$Proxy = MethodProxy.create(class_2, class_, (String)"()Ljava/lang/String;", (String)"toString", (String)"CGLIB$toString$2");
            CGLIB$hashCode$3$Method = arrmethod[2];
            CGLIB$hashCode$3$Proxy = MethodProxy.create(class_2, class_, (String)"()I", (String)"hashCode", (String)"CGLIB$hashCode$3");
            CGLIB$clone$4$Method = arrmethod[3];
            CGLIB$clone$4$Proxy = MethodProxy.create(class_2, class_, (String)"()Ljava/lang/Object;", (String)"clone", (String)"CGLIB$clone$4");
    
            // 原始类
            class_2 = Class.forName("com.zhiyin.cglib.cando.DemoService");
    
            
            CGLIB$hello$0$Method = ReflectUtils.findMethods((String[])new String[]{"hello", "(Ljava/lang/String;)Ljava/lang/String;"}, (Method[])class_2.getDeclaredMethods())[0];
            // hello方法代理 参数分别为 原始类 代理类 参数与返回值描述 方法名 代理方法名
            CGLIB$hello$0$Proxy = MethodProxy.create(class_2, class_, (String)"(Ljava/lang/String;)Ljava/lang/String;", (String)"hello", (String)"CGLIB$hello$0");
        }
    
    // 真正的服务方法
        final String CGLIB$hello$0(String string) {
            return super.hello(string);
        }
    
    // 代理方法
        public final String hello(String string) {
            MethodInterceptor methodInterceptor = this.CGLIB$CALLBACK_0;
            if (methodInterceptor == null) {
                DemoService$$EnhancerByCGLIB$$c23dc77c.CGLIB$BIND_CALLBACKS((Object)this);
                methodInterceptor = this.CGLIB$CALLBACK_0;
            }
            if (methodInterceptor != null) {
                return (String)methodInterceptor.intercept((Object)this, CGLIB$hello$0$Method, new Object[]{string}, CGLIB$hello$0$Proxy);
            }
            return super.hello(string);
        }
    
    

    参数见上面说明

      public static MethodProxy create(Class c1, Class c2, String desc, String name1, String name2) {
            MethodProxy proxy = new MethodProxy();
            proxy.sig1 = new Signature(name1, desc);
            proxy.sig2 = new Signature(name2, desc);
            proxy.createInfo = new CreateInfo(c1, c2);
            return proxy;
        }
    
        private void init()
        {
            /* 
             * Using a volatile invariant allows us to initialize the FastClass and
             * method index pairs atomically.
             * 
             * Double-checked locking is safe with volatile in Java 5.  Before 1.5 this 
             * code could allow fastClassInfo to be instantiated more than once, which
             * appears to be benign.
             */
            if (fastClassInfo == null)
            {
                synchronized (initLock)
                {
                    if (fastClassInfo == null)
                    {
                        CreateInfo ci = createInfo;
    
                        FastClassInfo fci = new FastClassInfo();
                        // ci.c1是原始类DemoService
                        fci.f1 = helper(ci, ci.c1);
                        // ci.c2是代理类
                        fci.f2 = helper(ci, ci.c2);
                        // hello
                        fci.i1 = fci.f1.getIndex(sig1);
                        // CGLIB$hello$0
                        fci.i2 = fci.f2.getIndex(sig2);
                        fastClassInfo = fci;
                        createInfo = null;
                    }
                }
            }
        }
    

    调用这里调用的是 代理类的代理方法

      public Object invokeSuper(Object obj, Object[] args) throws Throwable {
            try {
                // 初始化fastClassInfo
                init();
                FastClassInfo fci = fastClassInfo;
                // 调用代理类的CGLIB$hello$0方法
                return fci.f2.invoke(fci.i2, obj, args);
            } catch (InvocationTargetException e) {
                throw e.getTargetException();
            }
        }
    

    相关文章

      网友评论

          本文标题:Cglib FastClass例子

          本文链接:https://www.haomeiwen.com/subject/dvhecxtx.html