7.CGLIB动态代理源码之代理类对象的调用详解

文章详细阐述了CGLIB动态代理机制的工作流程,以Calculator类为例,介绍了代理类Calculator$$EnhancerByCGLIB$$b514f2c0的add方法如何通过FastClass和MethodProxy进行方法调用,最终执行到Calculator的add方法,同时涉及到了回调方法的拦截和执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


highlight: arduino-light

CGLIB代理类对象的调用过程详解

以代理类对象的add方法为例,讲一下CGLIB代理类对象的调用过程。

被代理类:Calculator

代理类:Calculator\$$EnhancerByCGLIB$$b514f2c0

被代理类的FastClass:Calculator\$$FastClassByCGLIB$$660dfb8f

代理类的FasClass:Calculator\$$EnhancerByCGLIB\$$b514f2c0\$$FastClassByCGLIB$$ec726d06

之前在生成代理类的时候有1个命名规则:类前缀 + \$$ + source + ByCGLIB + \$$ + hashCode

比如类名是Student,给Studeng生成代理类的类名是Enhance,那么生成的代理类的类名就是类似这种

Studeng\$$EnhancerByCGLIB$$a323h1ck0

代理类源码

```java package cglib;

import java.lang.reflect.Method; import org.springframework.cglib.core.ReflectUtils; import org.springframework.cglib.core.Signature; import org.springframework.cglib.proxy.Callback; import org.springframework.cglib.proxy.Factory; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy;

public class Calculator$$EnhancerByCGLIB$$b514f2c0 extends Calculator implements Factory { private boolean CGLIB$BOUND; public static Object CGLIB$FACTORYDATA; private static final ThreadLocal CGLIB$THREADCALLBACKS; private static final Callback[] CGLIB$STATICCALLBACKS; private MethodInterceptor CGLIB$CALLBACK0; private static Object CGLIB$CALLBACK_FILTER; private static final Method CGLIB$add$0$Method; private static final MethodProxy CGLIB$add$0$Proxy; private static final Object[] CGLIB$emptyArgs; private static final Method CGLIB$equals$1$Method; private static final MethodProxy CGLIB$equals$1$Proxy; private static final Method CGLIB$toString$2$Method; private static final MethodProxy CGLIB$toString$2$Proxy; private static final Method CGLIB$hashCode$3$Method; private static final MethodProxy CGLIB$hashCode$3$Proxy; private static final Method CGLIB$clone$4$Method; private static final MethodProxy CGLIB$clone$4$Proxy;

static void CGLIB$STATICHOOK1() {
    CGLIB$THREAD_CALLBACKS = new ThreadLocal();
    CGLIB$emptyArgs = new Object[0];
    Class var0 = Class.forName("cglib.Calculator$$EnhancerByCGLIB$$b514f2c0");
    Class var1;
    Method[] var10000 = ReflectUtils.findMethods(new String[]{"equals", "(Ljava/lang/Object;)Z", "toString", "()Ljava/lang/String;", "hashCode", "()I", "clone", "()Ljava/lang/Object;"}, (var1 = Class.forName("java.lang.Object")).getDeclaredMethods());
    CGLIB$equals$1$Method = var10000[0];
    CGLIB$equals$1$Proxy = MethodProxy.create(var1, var0, "(Ljava/lang/Object;)Z", "equals", "CGLIB$equals$1");
    CGLIB$toString$2$Method = var10000[1];
    CGLIB$toString$2$Proxy = MethodProxy.create(var1, var0, "()Ljava/lang/String;", "toString", "CGLIB$toString$2");
    CGLIB$hashCode$3$Method = var10000[2];
    CGLIB$hashCode$3$Proxy = MethodProxy.create(var1, var0, "()I", "hashCode", "CGLIB$hashCode$3");
    CGLIB$clone$4$Method = var10000[3];
    CGLIB$clone$4$Proxy = MethodProxy.create(var1, var0, "()Ljava/lang/Object;", "clone", "CGLIB$clone$4");
    CGLIB$add$0$Method = ReflectUtils.findMethods(new String[]{"add", "(II)I"}, 
                                                  (var1 = Class.forName("cglib.Calculator")).getDeclaredMethods())[0];
    CGLIB$add$0$Proxy = MethodProxy.create(var1, var0, "(II)I", "add", "CGLIB$add$0");
}

final int CGLIB$add$0(int var1, int var2) {
    return super.add(var1, var2);
}

public final int add(int var1, int var2) {
    MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
    if (var10000 == null) {
        CGLIB$BIND_CALLBACKS(this);
        var10000 = this.CGLIB$CALLBACK_0;
    }

    if (var10000 != null) {
        Object var3 = var10000.intercept(this, CGLIB$add$0$Method, new Object[]{new Integer(var1), new Integer(var2)}, CGLIB$add$0$Proxy);
        return var3 == null ? 0 : ((Number)var3).intValue();
    } else {
        return super.add(var1, var2);
    }
}

final boolean CGLIB$equals$1(Object var1) {
    return super.equals(var1);
}

public final boolean equals(Object var1) {
    MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
    if (var10000 == null) {
        CGLIB$BIND_CALLBACKS(this);
        var10000 = this.CGLIB$CALLBACK_0;
    }

    if (var10000 != null) {
        Object var2 = var10000.intercept(this, CGLIB$equals$1$Method, new Object[]{var1}, CGLIB$equals$1$Proxy);
        return var2 == null ? false : (Boolean)var2;
    } else {
        return super.equals(var1);
    }
}

final String CGLIB$toString$2() {
    return super.toString();
}

public final String toString() {
    MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
    if (var10000 == null) {
        CGLIB$BIND_CALLBACKS(this);
        var10000 = this.CGLIB$CALLBACK_0;
    }

    return var10000 != null ? (String)var10000.intercept(this, CGLIB$toString$2$Method, CGLIB$emptyArgs, CGLIB$toString$2$Proxy) : super.toString();
}

final int CGLIB$hashCode$3() {
    return super.hashCode();
}

public final int hashCode() {
    MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
    if (var10000 == null) {
        CGLIB$BIND_CALLBACKS(this);
        var10000 = this.CGLIB$CALLBACK_0;
    }

    if (var10000 != null) {
        Object var1 = var10000.intercept(this, CGLIB$hashCode$3$Method, CGLIB$emptyArgs, CGLIB$hashCode$3$Proxy);
        return var1 == null ? 0 : ((Number)var1).intValue();
    } else {
        return super.hashCode();
    }
}

final Object CGLIB$clone$4() throws CloneNotSupportedException {
    return super.clone();
}

protected final Object clone() throws CloneNotSupportedException {
    MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
    if (var10000 == null) {
        CGLIB$BIND_CALLBACKS(this);
        var10000 = this.CGLIB$CALLBACK_0;
    }

    return var10000 != null ? var10000.intercept(this, CGLIB$clone$4$Method, CGLIB$emptyArgs, CGLIB$clone$4$Proxy) : super.clone();
}

public static MethodProxy CGLIB$findMethodProxy(Signature var0) {
    String var10000 = var0.toString();
    switch(var10000.hashCode()) {
    case -1287932281:
        if (var10000.equals("add(II)I")) {
            return CGLIB$add$0$Proxy;
        }
        break;
    case -508378822:
        if (var10000.equals("clone()Ljava/lang/Object;")) {
            return CGLIB$clone$4$Proxy;
        }
        break;
    case 1826985398:
        if (var10000.equals("equals(Ljava/lang/Object;)Z")) {
            return CGLIB$equals$1$Proxy;
        }
        break;
    case 1913648695:
        if (var10000.equals("toString()Ljava/lang/String;")) {
            return CGLIB$toString$2$Proxy;
        }
        break;
    case 1984935277:
        if (var10000.equals("hashCode()I")) {
            return CGLIB$hashCode$3$Proxy;
        }
    }

    return null;
}

public Calculator$$EnhancerByCGLIB$$b514f2c0() {
    CGLIB$BIND_CALLBACKS(this);
}

public static void CGLIB$SET_THREAD_CALLBACKS(Callback[] var0) {
    CGLIB$THREAD_CALLBACKS.set(var0);
}

public static void CGLIB$SET_STATIC_CALLBACKS(Callback[] var0) {
    CGLIB$STATIC_CALLBACKS = var0;
}

private static final void CGLIB$BIND_CALLBACKS(Object var0) {
    Calculator$$EnhancerByCGLIB$$b514f2c0 var1 = (Calculator$$EnhancerByCGLIB$$b514f2c0)var0;
    if (!var1.CGLIB$BOUND) {
        var1.CGLIB$BOUND = true;
        Object var10000 = CGLIB$THREAD_CALLBACKS.get();
        if (var10000 == null) {
            var10000 = CGLIB$STATIC_CALLBACKS;
            if (var10000 == null) {
                return;
            }
        }

        var1.CGLIB$CALLBACK_0 = (MethodInterceptor)((Callback[])var10000)[0];
    }

}

public Object newInstance(Callback[] var1) {
    CGLIB$SET_THREAD_CALLBACKS(var1);
    Calculator$$EnhancerByCGLIB$$b514f2c0 var10000 = new Calculator$$EnhancerByCGLIB$$b514f2c0();
    CGLIB$SET_THREAD_CALLBACKS((Callback[])null);
    return var10000;
}

public Object newInstance(Callback var1) {
    CGLIB$SET_THREAD_CALLBACKS(new Callback[]{var1});
    Calculator$$EnhancerByCGLIB$$b514f2c0 var10000 = new Calculator$$EnhancerByCGLIB$$b514f2c0();
    CGLIB$SET_THREAD_CALLBACKS((Callback[])null);
    return var10000;
}

public Object newInstance(Class[] var1, Object[] var2, Callback[] var3) {
    CGLIB$SET_THREAD_CALLBACKS(var3);
    Calculator$$EnhancerByCGLIB$$b514f2c0 var10000 = new Calculator$$EnhancerByCGLIB$$b514f2c0;
    switch(var1.length) {
    case 0:
        var10000.<init>();
        CGLIB$SET_THREAD_CALLBACKS((Callback[])null);
        return var10000;
    default:
        throw new IllegalArgumentException("Constructor not found");
    }
}

public Callback getCallback(int var1) {
    CGLIB$BIND_CALLBACKS(this);
    MethodInterceptor var10000;
    switch(var1) {
    case 0:
        var10000 = this.CGLIB$CALLBACK_0;
        break;
    default:
        var10000 = null;
    }

    return var10000;
}

public void setCallback(int var1, Callback var2) {
    switch(var1) {
    case 0:
        this.CGLIB$CALLBACK_0 = (MethodInterceptor)var2;
    default:
    }
}

public Callback[] getCallbacks() {
    CGLIB$BIND_CALLBACKS(this);
    return new Callback[]{this.CGLIB$CALLBACK_0};
}

public void setCallbacks(Callback[] var1) {
    this.CGLIB$CALLBACK_0 = (MethodInterceptor)var1[0];
}

static {
    CGLIB$STATICHOOK1();
}

}

```

当我们执行到下面这行代码calculator.add(1, 1);会进入代理类的add方法

```java

import org.springframework.cglib.core.DebuggingClassWriter; import org.springframework.cglib.core.KeyFactory; import org.springframework.cglib.core.MethodWrapper; import org.springframework.cglib.proxy.Enhancer;

import java.lang.reflect.Method;

/* * @author: claude * @date: 2023/3/3 * @description: */ public class CalculatorProxyFactory { public static void main(String[] args) { //动态代理创建的class文件存储到本地 System.setProperty(DebuggingClassWriter.DEBUGLOCATIONPROPERTY, "e:\proxy"); //通过cglib动态代理获取代理对象的过程,创建调用的对象 Enhancer enhancer = new Enhancer(); //设置enhancer对象的父类 enhancer.setSuperclass(Calculator.class); //设置enhancer的回调对象 enhancer.setCallback(new CalculatorMethodInterceptor(new Calculator())); //创建代理对象 Calculator calculator = (Calculator) enhancer.create(); //通过代理对象调用目标方法 calculator.add(1, 1); } } ```

代理类的add方法

```java public final int add(int var1, int var2) { //this.CGLIB$CALLBACK0;就是我们的CalculatorMethodInterceptor MethodInterceptor var10000 = this.CGLIB$CALLBACK0; if (var10000 == null) { CGLIB$BINDCALLBACKS(this); var10000 = this.CGLIB$CALLBACK0; }

if (var10000 != null) {
        /*
        执行CalculatorMethodInterceptor#intercept
        此方法用来实现方法的拦截,四个参数分别表示的含义:
        obj:cglib生成的代理对象实例
        method: 被代理对象的原始add方法
        args:被代理对象的原始add方法入参
        proxy:被代理对象的原始add方法对应的MethodProxy
        */
        Object var3 = var10000.intercept
                        (this, CGLIB$add$0$Method, new Object[]{new Integer(var1), new Integer(var2)}, CGLIB$add$0$Proxy);
        return var3 == null ? 0 : ((Number)var3).intValue();
    } else {
        return super.add(var1, var2);
    }
}

```

CalculatorMethodInterceptor#intercept

```java package cglib;

import com.sun.org.apache.bcel.internal.generic.Type; import org.springframework.cglib.core.Signature; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import org.springframework.cglib.reflect.FastClass;

import java.lang.reflect.Method; public class CalculatorMethodInterceptor implements MethodInterceptor {

private Calculator target;

public CalculatorMethodInterceptor(Calculator target) {
    this.target = target;
}

/* 此方法用来实现方法的拦截,四个参数分别表示的含义: obj:cglib生成的代理对象实例 method: 被代理对象的原始add方法 args:被代理对象的原始add方法入参 proxy:被代理对象的原始add方法对应的MethodProxy */ @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { Object result = methodProxy.invokeSuper(proxy, args); System.out.println("计算结果:" + result); return result; } } ```

MethodProxy#invokeSuper

java public Object invokeSuper(Object obj, Object[] args) throws Throwable { try { //1.获取代理类和被代理类的Fastclass //2.获取要调用的方法的在2个Fastclass中的下标 init(); FastClassInfo fci = fastClassInfo; //代理类的invoke方法 //fci.f2:生成的代理类的Fastclass //fci.i2:生成的代理类的Fastclass中的方法的下标 return fci.f2.invoke(fci.i2, obj, args); } catch (InvocationTargetException e) { throw e.getTargetException(); } }

先看下什么是MethodProxy?

在生成的代理类中会为每个被代理类的方法创建1个MethodProxy,创建MethodProxy的方法就是create方法。

MethodProxy封装了方法名和签名以及CreateInfo。

java 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; }

CreateInfo封装了代理类和被代理类的class

JAVA public CreateInfo(Class c1, Class c2) { this.c1 = c1; this.c2 = c2; AbstractClassGenerator fromEnhancer = AbstractClassGenerator.getCurrent(); if (fromEnhancer != null) { namingPolicy = fromEnhancer.getNamingPolicy(); strategy = fromEnhancer.getStrategy(); attemptLoad = fromEnhancer.getAttemptLoad(); } }

综上所述MethodProxy封装了方法名和签名以及代理类和被代理类的class。

MethodProxy#init

接着继续往下看init方法,主要是生成fastClassInfo。

java private void init() { if (fastClassInfo == null) { synchronized (initLock) { if (fastClassInfo == null) { //createInfo里封装了代理类和被代理类的class CreateInfo ci = createInfo; FastClassInfo fci = new FastClassInfo(); //f1:被代理类的Fastclass fci.f1 = helper(ci, ci.c1); //f2:生成的代理类的Fastclass fci.f2 = helper(ci, ci.c2); //i1:被代理类的Fastclass中的下标 sig1 = add,(II)I fci.i1 = fci.f1.getIndex(sig1); //i2:生成的代理类的Fastclass中的下标 sig2 = CGLIB$add$0,(II)I fci.i2 = fci.f2.getIndex(sig2); fastClassInfo = fci; createInfo = null; } } } }

第一步:生成被代理类的Fastclass和代理类的Fastclass。

和之前生成EnhanceKey以及代理类Calculator以及MethodWrapper.MethodWrapperKey并没有什么不同。

唯一不同的是这里用的ClassGenerator是FastClass.Generator。

java private static FastClass helper(CreateInfo ci, Class type) { FastClass.Generator g = new FastClass.Generator(); g.setType(type); // SPRING PATCH BEGIN g.setContextClass(type); // SPRING PATCH END g.setClassLoader(ci.c2.getClassLoader()); g.setNamingPolicy(ci.namingPolicy); g.setStrategy(ci.strategy); g.setAttemptLoad(ci.attemptLoad); return g.create(); }

第二步:获取被代理类的Fastclass中add方法的下标和代理类的Fastclass中的add方法下标

```java //被代理类的Fastclass中的下标 0 public int getIndex(Signature var1) { String var10000 = var1.toString(); switch(var10000.hashCode()) { case -1287932281: if (var10000.equals("add(II)I")) { return 0; } } }
//生成的代理类的Fastclass中的下标 18 public int getIndex(Signature var1) { String var10000 = var1.toString(); switch(var10000.hashCode()) {

case -1287932281:
        if (var10000.equals("add(II)I")) {
            return 19;
        }
    }

} ```

第三步:将代理类和被代理类的FastClass以及代理类和被代理类的add方法的下标封装到FastClassInfo

```java private static class FastClassInfo {

//被代理类FastClass
    FastClass f1;
    //代理类FastClass
    FastClass f2;
    //被代理类FastClass中add方法的下标
    int i1;
    //代理类FastClass中add方法的下标
    int i2;
}

```

FastClass#invoke

接下来执行的代码是MethodProxy#invokeSuper中的

java //fci.f2是代理类FastClass //fci.i2是代理类FastClass中add方法的下标18 return fci.f2.invoke(fci.i2, obj, args);

也就是调用的是代理类的Fastclass的invoke方法,源码如下

```java

package cglib; import cglib.Calculator..EnhancerByCGLIB..b514f2c0; import java.lang.reflect.InvocationTargetException; import org.springframework.cglib.core.Signature; import org.springframework.cglib.proxy.Callback; import org.springframework.cglib.reflect.FastClass;

public class Calculator$$EnhancerByCGLIB$$b514f2c0$$FastClassByCGLIB$$ec726d06 extends FastClass { public Calculator$$EnhancerByCGLIB$$b514f2c0$$FastClassByCGLIB$$ec726d06(Class var1) { super(var1); }

/* var1=18 var2=cglib.Calculator$$EnhancerByCGLIB$$b514f2c0@57fffcd7 var3= {Object[2]@709} 参数1:方法下标 参数2:代理类对象 参数3:参数数组 */ public Object invoke(int var1, Object var2, Object[] var3) throws InvocationTargetException { //将代理类对象赋值给var10000 b514f2c0 var10000 = (b514f2c0)var2; int var10001 = var1;

try {
        switch(var10001) {
        case 0:
            return new Integer(var10000.add(((Number)var3[0]).intValue(), ((Number)var3[1]).intValue()));
        case 1:
            return new Boolean(var10000.equals(var3[0]));
        case 2:
            return var10000.toString();
        case 3:
            return new Integer(var10000.hashCode());
        case 4:
            return var10000.clone();
        case 5:
            return var10000.newInstance((Callback[])var3[0]);
        case 6:
            return var10000.newInstance((Class[])var3[0], (Object[])var3[1], (Callback[])var3[2]);
        case 7:
            return var10000.newInstance((Callback)var3[0]);
        case 8:
            var10000.setCallbacks((Callback[])var3[0]);
            return null;
        case 9:
            var10000.setCallback(((Number)var3[0]).intValue(), (Callback)var3[1]);
            return null;
        case 10:
            return var10000.getCallback(((Number)var3[0]).intValue());
        case 11:
            return var10000.getCallbacks();
        case 12:
            return b514f2c0.CGLIB$findMethodProxy((Signature)var3[0]);
        case 13:
            b514f2c0.CGLIB$SET_THREAD_CALLBACKS((Callback[])var3[0]);
            return null;
        case 14:
            b514f2c0.CGLIB$SET_STATIC_CALLBACKS((Callback[])var3[0]);
            return null;
        case 15:
            return new Boolean(var10000.CGLIB$equals$1(var3[0]));
        case 16:
            return var10000.CGLIB$clone$4();
        case 17:
            return var10000.CGLIB$toString$2();
        case 18:
            //因为方法下标是18进入到这里 
            //var10000是代理类对象
            //也就是说调用的是代理类对象的CGLIB$add$0方法
            //
            return new Integer(var10000.CGLIB$add$0(((Number)var3[0]).intValue(), ((Number)var3[1]).intValue()));
        case 19:
            return new Integer(var10000.CGLIB$hashCode$3());
        case 20:
            b514f2c0.CGLIB$STATICHOOK1();
            return null;
        }
    } catch (Throwable var4) {
        throw new InvocationTargetException(var4);
    }

    throw new IllegalArgumentException("Cannot find matching method/constructor");
}

} ```

看看代理类对象的CGLIB$add$0方法吧

java //代理类MyCalculator$$EnhancerByCGLIB$$d1716464的CGLIB$add$0方法 //最后调用的还是父类的add方法 final int CGLIB$add$0(int var1, int var2) { return super.add(var1, var2); }

附录:生成的字节码件

代理类

```java // // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) //

package cglib;

import java.lang.reflect.Method; import org.springframework.cglib.core.ReflectUtils; import org.springframework.cglib.core.Signature; import org.springframework.cglib.proxy.Callback; import org.springframework.cglib.proxy.Factory; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy;

public class Calculator$$EnhancerByCGLIB$$b514f2c0 extends Calculator implements Factory { private boolean CGLIB$BOUND; public static Object CGLIB$FACTORYDATA; private static final ThreadLocal CGLIB$THREADCALLBACKS; private static final Callback[] CGLIB$STATICCALLBACKS; private MethodInterceptor CGLIB$CALLBACK0; private static Object CGLIB$CALLBACK_FILTER; private static final Method CGLIB$add$0$Method; private static final MethodProxy CGLIB$add$0$Proxy; private static final Object[] CGLIB$emptyArgs; private static final Method CGLIB$equals$1$Method; private static final MethodProxy CGLIB$equals$1$Proxy; private static final Method CGLIB$toString$2$Method; private static final MethodProxy CGLIB$toString$2$Proxy; private static final Method CGLIB$hashCode$3$Method; private static final MethodProxy CGLIB$hashCode$3$Proxy; private static final Method CGLIB$clone$4$Method; private static final MethodProxy CGLIB$clone$4$Proxy;

static void CGLIB$STATICHOOK1() {
    CGLIB$THREAD_CALLBACKS = new ThreadLocal();
    CGLIB$emptyArgs = new Object[0];
    Class var0 = Class.forName("cglib.Calculator$$EnhancerByCGLIB$$b514f2c0");
    Class var1;
    Method[] var10000 = ReflectUtils.findMethods(new String[]{"equals", "(Ljava/lang/Object;)Z", "toString", "()Ljava/lang/String;", "hashCode", "()I", "clone", "()Ljava/lang/Object;"}, (var1 = Class.forName("java.lang.Object")).getDeclaredMethods());
    CGLIB$equals$1$Method = var10000[0];
    CGLIB$equals$1$Proxy = MethodProxy.create(var1, var0, "(Ljava/lang/Object;)Z", "equals", "CGLIB$equals$1");
    CGLIB$toString$2$Method = var10000[1];
    CGLIB$toString$2$Proxy = MethodProxy.create(var1, var0, "()Ljava/lang/String;", "toString", "CGLIB$toString$2");
    CGLIB$hashCode$3$Method = var10000[2];
    CGLIB$hashCode$3$Proxy = MethodProxy.create(var1, var0, "()I", "hashCode", "CGLIB$hashCode$3");
    CGLIB$clone$4$Method = var10000[3];
    CGLIB$clone$4$Proxy = MethodProxy.create(var1, var0, "()Ljava/lang/Object;", "clone", "CGLIB$clone$4");
    CGLIB$add$0$Method = ReflectUtils.findMethods(new String[]{"add", "(II)I"}, (var1 = Class.forName("cglib.Calculator")).getDeclaredMethods())[0];
    CGLIB$add$0$Proxy = MethodProxy.create(var1, var0, "(II)I", "add", "CGLIB$add$0");
}

final int CGLIB$add$0(int var1, int var2) {
    return super.add(var1, var2);
}

public final int add(int var1, int var2) {
    MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
    if (var10000 == null) {
        CGLIB$BIND_CALLBACKS(this);
        var10000 = this.CGLIB$CALLBACK_0;
    }

    if (var10000 != null) {
        Object var3 = var10000.intercept(this, CGLIB$add$0$Method, new Object[]{new Integer(var1), new Integer(var2)}, CGLIB$add$0$Proxy);
        return var3 == null ? 0 : ((Number)var3).intValue();
    } else {
        return super.add(var1, var2);
    }
}

final boolean CGLIB$equals$1(Object var1) {
    return super.equals(var1);
}

public final boolean equals(Object var1) {
    MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
    if (var10000 == null) {
        CGLIB$BIND_CALLBACKS(this);
        var10000 = this.CGLIB$CALLBACK_0;
    }

    if (var10000 != null) {
        Object var2 = var10000.intercept(this, CGLIB$equals$1$Method, new Object[]{var1}, CGLIB$equals$1$Proxy);
        return var2 == null ? false : (Boolean)var2;
    } else {
        return super.equals(var1);
    }
}

final String CGLIB$toString$2() {
    return super.toString();
}

public final String toString() {
    MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
    if (var10000 == null) {
        CGLIB$BIND_CALLBACKS(this);
        var10000 = this.CGLIB$CALLBACK_0;
    }

    return var10000 != null ? (String)var10000.intercept(this, CGLIB$toString$2$Method, CGLIB$emptyArgs, CGLIB$toString$2$Proxy) : super.toString();
}

final int CGLIB$hashCode$3() {
    return super.hashCode();
}

public final int hashCode() {
    MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
    if (var10000 == null) {
        CGLIB$BIND_CALLBACKS(this);
        var10000 = this.CGLIB$CALLBACK_0;
    }

    if (var10000 != null) {
        Object var1 = var10000.intercept(this, CGLIB$hashCode$3$Method, CGLIB$emptyArgs, CGLIB$hashCode$3$Proxy);
        return var1 == null ? 0 : ((Number)var1).intValue();
    } else {
        return super.hashCode();
    }
}

final Object CGLIB$clone$4() throws CloneNotSupportedException {
    return super.clone();
}

protected final Object clone() throws CloneNotSupportedException {
    MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
    if (var10000 == null) {
        CGLIB$BIND_CALLBACKS(this);
        var10000 = this.CGLIB$CALLBACK_0;
    }

    return var10000 != null ? var10000.intercept(this, CGLIB$clone$4$Method, CGLIB$emptyArgs, CGLIB$clone$4$Proxy) : super.clone();
}

public static MethodProxy CGLIB$findMethodProxy(Signature var0) {
    String var10000 = var0.toString();
    switch(var10000.hashCode()) {
    case -1287932281:
        if (var10000.equals("add(II)I")) {
            return CGLIB$add$0$Proxy;
        }
        break;
    case -508378822:
        if (var10000.equals("clone()Ljava/lang/Object;")) {
            return CGLIB$clone$4$Proxy;
        }
        break;
    case 1826985398:
        if (var10000.equals("equals(Ljava/lang/Object;)Z")) {
            return CGLIB$equals$1$Proxy;
        }
        break;
    case 1913648695:
        if (var10000.equals("toString()Ljava/lang/String;")) {
            return CGLIB$toString$2$Proxy;
        }
        break;
    case 1984935277:
        if (var10000.equals("hashCode()I")) {
            return CGLIB$hashCode$3$Proxy;
        }
    }

    return null;
}

public Calculator$$EnhancerByCGLIB$$b514f2c0() {
    CGLIB$BIND_CALLBACKS(this);
}

public static void CGLIB$SET_THREAD_CALLBACKS(Callback[] var0) {
    CGLIB$THREAD_CALLBACKS.set(var0);
}

public static void CGLIB$SET_STATIC_CALLBACKS(Callback[] var0) {
    CGLIB$STATIC_CALLBACKS = var0;
}

private static final void CGLIB$BIND_CALLBACKS(Object var0) {
    Calculator$$EnhancerByCGLIB$$b514f2c0 var1 = (Calculator$$EnhancerByCGLIB$$b514f2c0)var0;
    if (!var1.CGLIB$BOUND) {
        var1.CGLIB$BOUND = true;
        Object var10000 = CGLIB$THREAD_CALLBACKS.get();
        if (var10000 == null) {
            var10000 = CGLIB$STATIC_CALLBACKS;
            if (var10000 == null) {
                return;
            }
        }

        var1.CGLIB$CALLBACK_0 = (MethodInterceptor)((Callback[])var10000)[0];
    }

}

public Object newInstance(Callback[] var1) {
    CGLIB$SET_THREAD_CALLBACKS(var1);
    Calculator$$EnhancerByCGLIB$$b514f2c0 var10000 = new Calculator$$EnhancerByCGLIB$$b514f2c0();
    CGLIB$SET_THREAD_CALLBACKS((Callback[])null);
    return var10000;
}

public Object newInstance(Callback var1) {
    CGLIB$SET_THREAD_CALLBACKS(new Callback[]{var1});
    Calculator$$EnhancerByCGLIB$$b514f2c0 var10000 = new Calculator$$EnhancerByCGLIB$$b514f2c0();
    CGLIB$SET_THREAD_CALLBACKS((Callback[])null);
    return var10000;
}

public Object newInstance(Class[] var1, Object[] var2, Callback[] var3) {
    CGLIB$SET_THREAD_CALLBACKS(var3);
    Calculator$$EnhancerByCGLIB$$b514f2c0 var10000 = new Calculator$$EnhancerByCGLIB$$b514f2c0;
    switch(var1.length) {
    case 0:
        var10000.<init>();
        CGLIB$SET_THREAD_CALLBACKS((Callback[])null);
        return var10000;
    default:
        throw new IllegalArgumentException("Constructor not found");
    }
}

public Callback getCallback(int var1) {
    CGLIB$BIND_CALLBACKS(this);
    MethodInterceptor var10000;
    switch(var1) {
    case 0:
        var10000 = this.CGLIB$CALLBACK_0;
        break;
    default:
        var10000 = null;
    }

    return var10000;
}

public void setCallback(int var1, Callback var2) {
    switch(var1) {
    case 0:
        this.CGLIB$CALLBACK_0 = (MethodInterceptor)var2;
    default:
    }
}

public Callback[] getCallbacks() {
    CGLIB$BIND_CALLBACKS(this);
    return new Callback[]{this.CGLIB$CALLBACK_0};
}

public void setCallbacks(Callback[] var1) {
    this.CGLIB$CALLBACK_0 = (MethodInterceptor)var1[0];
}

static {
    CGLIB$STATICHOOK1();
}

}

```

被代理类的FastClass

```java // // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) //

package cglib;

import java.lang.reflect.InvocationTargetException; import org.springframework.cglib.core.Signature; import org.springframework.cglib.reflect.FastClass;

public class Calculator$$FastClassByCGLIB$$660dfb8f extends FastClass { public Calculator$$FastClassByCGLIB$$660dfb8f(Class var1) { super(var1); }

public int getIndex(Signature var1) {
    String var10000 = var1.toString();
    switch(var10000.hashCode()) {
    case -1287932281:
        if (var10000.equals("add(II)I")) {
            return 0;
        }
        break;
    case 1826985398:
        if (var10000.equals("equals(Ljava/lang/Object;)Z")) {
            return 1;
        }
        break;
    case 1913648695:
        if (var10000.equals("toString()Ljava/lang/String;")) {
            return 2;
        }
        break;
    case 1984935277:
        if (var10000.equals("hashCode()I")) {
            return 3;
        }
    }

    return -1;
}

public int getIndex(String var1, Class[] var2) {
    switch(var1.hashCode()) {
    case -1776922004:
        if (var1.equals("toString")) {
            switch(var2.length) {
            case 0:
                return 2;
            }
        }
        break;
    case -1295482945:
        if (var1.equals("equals")) {
            switch(var2.length) {
            case 1:
                if (var2[0].getName().equals("java.lang.Object")) {
                    return 1;
                }
            }
        }
        break;
    case 96417:
        if (var1.equals("add")) {
            switch(var2.length) {
            case 2:
                if (var2[0].getName().equals("int") && var2[1].getName().equals("int")) {
                    return 0;
                }
            }
        }
        break;
    case 147696667:
        if (var1.equals("hashCode")) {
            switch(var2.length) {
            case 0:
                return 3;
            }
        }
    }

    return -1;
}

public int getIndex(Class[] var1) {
    switch(var1.length) {
    case 0:
        return 0;
    default:
        return -1;
    }
}

public Object invoke(int var1, Object var2, Object[] var3) throws InvocationTargetException {
    Calculator var10000 = (Calculator)var2;
    int var10001 = var1;

    try {
        switch(var10001) {
        case 0:
            return new Integer(var10000.add(((Number)var3[0]).intValue(), ((Number)var3[1]).intValue()));
        case 1:
            return new Boolean(var10000.equals(var3[0]));
        case 2:
            return var10000.toString();
        case 3:
            return new Integer(var10000.hashCode());
        }
    } catch (Throwable var4) {
        throw new InvocationTargetException(var4);
    }

    throw new IllegalArgumentException("Cannot find matching method/constructor");
}

public Object newInstance(int var1, Object[] var2) throws InvocationTargetException {
    Calculator var10000 = new Calculator;
    Calculator var10001 = var10000;
    int var10002 = var1;

    try {
        switch(var10002) {
        case 0:
            var10001.<init>();
            return var10000;
        }
    } catch (Throwable var3) {
        throw new InvocationTargetException(var3);
    }

    throw new IllegalArgumentException("Cannot find matching method/constructor");
}

public int getMaxIndex() {
    return 3;
}

}

```

代理类的FasClass

```java // // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) //

package cglib;

import cglib.Calculator..EnhancerByCGLIB..b514f2c0; import java.lang.reflect.InvocationTargetException; import org.springframework.cglib.core.Signature; import org.springframework.cglib.proxy.Callback; import org.springframework.cglib.reflect.FastClass;

public class Calculator$$EnhancerByCGLIB$$b514f2c0$$FastClassByCGLIB$$ec726d06 extends FastClass { public Calculator$$EnhancerByCGLIB$$b514f2c0$$FastClassByCGLIB$$ec726d06(Class var1) { super(var1); }

public int getIndex(Signature var1) {
    String var10000 = var1.toString();
    switch(var10000.hashCode()) {
    case -1882565338:
        if (var10000.equals("CGLIB$equals$1(Ljava/lang/Object;)Z")) {
            return 15;
        }
        break;
    case -1870561232:
        if (var10000.equals("CGLIB$findMethodProxy(Lorg/springframework/cglib/core/Signature;)Lorg/springframework/cglib/proxy/MethodProxy;")) {
            return 12;
        }
        break;
    case -1745842178:
        if (var10000.equals("setCallbacks([Lorg/springframework/cglib/proxy/Callback;)V")) {
            return 8;
        }
        break;
    case -1641413109:
        if (var10000.equals("newInstance([Lorg/springframework/cglib/proxy/Callback;)Ljava/lang/Object;")) {
            return 5;
        }
        break;
    case -1457535688:
        if (var10000.equals("CGLIB$STATICHOOK1()V")) {
            return 20;
        }
        break;
    case -1411842725:
        if (var10000.equals("CGLIB$hashCode$3()I")) {
            return 19;
        }
        break;
    case -1287932281:
        if (var10000.equals("add(II)I")) {
            return 0;
        }
        break;
    case -1034266769:
        if (var10000.equals("CGLIB$SET_STATIC_CALLBACKS([Lorg/springframework/cglib/proxy/Callback;)V")) {
            return 14;
        }
        break;
    case -1025895669:
        if (var10000.equals("CGLIB$SET_THREAD_CALLBACKS([Lorg/springframework/cglib/proxy/Callback;)V")) {
            return 13;
        }
        break;
    case -988317324:
        if (var10000.equals("newInstance([Ljava/lang/Class;[Ljava/lang/Object;[Lorg/springframework/cglib/proxy/Callback;)Ljava/lang/Object;")) {
            return 6;
        }
        break;
    case -984241474:
        if (var10000.equals("CGLIB$add$0(II)I")) {
            return 18;
        }
        break;
    case -508378822:
        if (var10000.equals("clone()Ljava/lang/Object;")) {
            return 4;
        }
        break;
    case 610042816:
        if (var10000.equals("newInstance(Lorg/springframework/cglib/proxy/Callback;)Ljava/lang/Object;")) {
            return 7;
        }
        break;
    case 1132856532:
        if (var10000.equals("getCallbacks()[Lorg/springframework/cglib/proxy/Callback;")) {
            return 11;
        }
        break;
    case 1246779367:
        if (var10000.equals("setCallback(ILorg/springframework/cglib/proxy/Callback;)V")) {
            return 9;
        }
        break;
    case 1306468936:
        if (var10000.equals("CGLIB$toString$2()Ljava/lang/String;")) {
            return 17;
        }
        break;
    case 1364367423:
        if (var10000.equals("getCallback(I)Lorg/springframework/cglib/proxy/Callback;")) {
            return 10;
        }
        break;
    case 1800494055:
        if (var10000.equals("CGLIB$clone$4()Ljava/lang/Object;")) {
            return 16;
        }
        break;
    case 1826985398:
        if (var10000.equals("equals(Ljava/lang/Object;)Z")) {
            return 1;
        }
        break;
    case 1913648695:
        if (var10000.equals("toString()Ljava/lang/String;")) {
            return 2;
        }
        break;
    case 1984935277:
        if (var10000.equals("hashCode()I")) {
            return 3;
        }
    }

    return -1;
}

public int getIndex(String var1, Class[] var2) {
    switch(var1.hashCode()) {
    case -1776922004:
        if (var1.equals("toString")) {
            switch(var2.length) {
            case 0:
                return 2;
            }
        }
        break;
    case -1295482945:
        if (var1.equals("equals")) {
            switch(var2.length) {
            case 1:
                if (var2[0].getName().equals("java.lang.Object")) {
                    return 1;
                }
            }
        }
        break;
    case -1053468136:
        if (var1.equals("getCallbacks")) {
            switch(var2.length) {
            case 0:
                return 11;
            }
        }
        break;
    case -124978609:
        if (var1.equals("CGLIB$equals$1")) {
            switch(var2.length) {
            case 1:
                if (var2[0].getName().equals("java.lang.Object")) {
                    return 15;
                }
            }
        }
        break;
    case -60403779:
        if (var1.equals("CGLIB$SET_STATIC_CALLBACKS")) {
            switch(var2.length) {
            case 1:
                if (var2[0].getName().equals("[Lorg.springframework.cglib.proxy.Callback;")) {
                    return 14;
                }
            }
        }
        break;
    case -29025555:
        if (var1.equals("CGLIB$hashCode$3")) {
            switch(var2.length) {
            case 0:
                return 19;
            }
        }
        break;
    case 96417:
        if (var1.equals("add")) {
            switch(var2.length) {
            case 2:
                if (var2[0].getName().equals("int") && var2[1].getName().equals("int")) {
                    return 0;
                }
            }
        }
        break;
    case 85179481:
        if (var1.equals("CGLIB$SET_THREAD_CALLBACKS")) {
            switch(var2.length) {
            case 1:
                if (var2[0].getName().equals("[Lorg.springframework.cglib.proxy.Callback;")) {
                    return 13;
                }
            }
        }
        break;
    case 94756189:
        if (var1.equals("clone")) {
            switch(var2.length) {
            case 0:
                return 4;
            }
        }
        break;
    case 147696667:
        if (var1.equals("hashCode")) {
            switch(var2.length) {
            case 0:
                return 3;
            }
        }
        break;
    case 161998109:
        if (var1.equals("CGLIB$STATICHOOK1")) {
            switch(var2.length) {
            case 0:
                return 20;
            }
        }
        break;
    case 495524492:
        if (var1.equals("setCallbacks")) {
            switch(var2.length) {
            case 1:
                if (var2[0].getName().equals("[Lorg.springframework.cglib.proxy.Callback;")) {
                    return 8;
                }
            }
        }
        break;
    case 1108311562:
        if (var1.equals("CGLIB$add$0")) {
            switch(var2.length) {
            case 2:
                if (var2[0].getName().equals("int") && var2[1].getName().equals("int")) {
                    return 18;
                }
            }
        }
        break;
    case 1154623345:
        if (var1.equals("CGLIB$findMethodProxy")) {
            switch(var2.length) {
            case 1:
                if (var2[0].getName().equals("org.springframework.cglib.core.Signature")) {
                    return 12;
                }
            }
        }
        break;
    case 1543336189:
        if (var1.equals("CGLIB$toString$2")) {
            switch(var2.length) {
            case 0:
                return 17;
            }
        }
        break;
    case 1811874389:
        if (var1.equals("newInstance")) {
            switch(var2.length) {
            case 1:
                String var10001 = var2[0].getName();
                switch(var10001.hashCode()) {
                case -1997738671:
                    if (var10001.equals("[Lorg.springframework.cglib.proxy.Callback;")) {
                        return 5;
                    }
                    break;
                case 1364160985:
                    if (var10001.equals("org.springframework.cglib.proxy.Callback")) {
                        return 7;
                    }
                }
            case 2:
            default:
                break;
            case 3:
                if (var2[0].getName().equals("[Ljava.lang.Class;") && var2[1].getName().equals("[Ljava.lang.Object;") && var2[2].getName().equals("[Lorg.springframework.cglib.proxy.Callback;")) {
                    return 6;
                }
            }
        }
        break;
    case 1817099975:
        if (var1.equals("setCallback")) {
            switch(var2.length) {
            case 2:
                if (var2[0].getName().equals("int") && var2[1].getName().equals("org.springframework.cglib.proxy.Callback")) {
                    return 9;
                }
            }
        }
        break;
    case 1905679803:
        if (var1.equals("getCallback")) {
            switch(var2.length) {
            case 1:
                if (var2[0].getName().equals("int")) {
                    return 10;
                }
            }
        }
        break;
    case 1951977610:
        if (var1.equals("CGLIB$clone$4")) {
            switch(var2.length) {
            case 0:
                return 16;
            }
        }
    }

    return -1;
}

public int getIndex(Class[] var1) {
    switch(var1.length) {
    case 0:
        return 0;
    default:
        return -1;
    }
}

public Object invoke(int var1, Object var2, Object[] var3) throws InvocationTargetException {
    b514f2c0 var10000 = (b514f2c0)var2;
    int var10001 = var1;

    try {
        switch(var10001) {
        case 0:
            return new Integer(var10000.add(((Number)var3[0]).intValue(), ((Number)var3[1]).intValue()));
        case 1:
            return new Boolean(var10000.equals(var3[0]));
        case 2:
            return var10000.toString();
        case 3:
            return new Integer(var10000.hashCode());
        case 4:
            return var10000.clone();
        case 5:
            return var10000.newInstance((Callback[])var3[0]);
        case 6:
            return var10000.newInstance((Class[])var3[0], (Object[])var3[1], (Callback[])var3[2]);
        case 7:
            return var10000.newInstance((Callback)var3[0]);
        case 8:
            var10000.setCallbacks((Callback[])var3[0]);
            return null;
        case 9:
            var10000.setCallback(((Number)var3[0]).intValue(), (Callback)var3[1]);
            return null;
        case 10:
            return var10000.getCallback(((Number)var3[0]).intValue());
        case 11:
            return var10000.getCallbacks();
        case 12:
            return b514f2c0.CGLIB$findMethodProxy((Signature)var3[0]);
        case 13:
            b514f2c0.CGLIB$SET_THREAD_CALLBACKS((Callback[])var3[0]);
            return null;
        case 14:
            b514f2c0.CGLIB$SET_STATIC_CALLBACKS((Callback[])var3[0]);
            return null;
        case 15:
            return new Boolean(var10000.CGLIB$equals$1(var3[0]));
        case 16:
            return var10000.CGLIB$clone$4();
        case 17:
            return var10000.CGLIB$toString$2();
        case 18:
            return new Integer(var10000.CGLIB$add$0(((Number)var3[0]).intValue(), ((Number)var3[1]).intValue()));
        case 19:
            return new Integer(var10000.CGLIB$hashCode$3());
        case 20:
            b514f2c0.CGLIB$STATICHOOK1();
            return null;
        }
    } catch (Throwable var4) {
        throw new InvocationTargetException(var4);
    }

    throw new IllegalArgumentException("Cannot find matching method/constructor");
}

public Object newInstance(int var1, Object[] var2) throws InvocationTargetException {
    b514f2c0 var10000 = new b514f2c0;
    b514f2c0 var10001 = var10000;
    int var10002 = var1;

    try {
        switch(var10002) {
        case 0:
            var10001.<init>();
            return var10000;
        }
    } catch (Throwable var3) {
        throw new InvocationTargetException(var3);
    }

    throw new IllegalArgumentException("Cannot find matching method/constructor");
}

public int getMaxIndex() {
    return 20;
}

}

```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值