jdk 动态代理与 cglib 动态代理原理
1. JDK 动态代理
jdk 动态代理是通过实现被代理类的接口来实现的,通过 jdk 动态代理生成的类会继承 java.lang.reflect.Proxy,同时实现被代理类的接口。
由于 jdk 动态代理已经继承了 java.lang.reflect.Proxy,所以它就不能通过继承类的方式来实现动态代理了,所以选择了实现接口的方式来生成动态代理。
举例:为 IHello 接口生成一个动态代理类,并将它的字节码文件输出到文件中
(不管是动态生成的类,还是普通的类,最后都需要拿到二进制的字节码数组,然后通过 classloader 加载到 jvm 中,所以,不管是什么类,理论上我们都可以将它的字节码数组拿到并输出到文件中)
1 public interface IHello { 2 public String sayHello(String name); 3 } 4 5 // 通过 java.lang.reflect.Proxy 来为 IHello 生成一个代理类 6 IHello realObj = new HelloImpl(); 7 IHello proxyObj = (IHello) Proxy.newProxyInstance(realObj.getClass().getClassLoader(), 8 realObj.getClass().getInterfaces(), new InvocationHandler() { 9 @Override 10 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 11 // 方法执行前可以插入逻辑 12 // 执行被代理类的方法 13 Object obj = method.invoke(realObj, args); 14 // 方法执行后可以插入逻辑 15 return obj; 16 } 17 });
断点打在 java.lang.reflect.Proxy.ProxyClassFactory#apply() Line 642 处
调用如下代码,将字节码文件进行输出,然后拿到文件反编译
new FileOutputStream("d:\\a.class").getChannel().write(ByteBuffer.wrap(proxyClassFile))
1 public final class $Proxy0 extends Proxy implements IHello 2 { 3 private static Method m1; 4 private static Method m3; 5 private static Method m2; 6 private static Method m0; 7 8 public $Proxy0(final InvocationHandler invocationHandler) { 9 super(invocationHandler); 10 } 11 12 public final boolean equals(final Object o) { 13 try { 14 return (boolean)super.h.invoke(this, $Proxy0.m1, new Object[] { o }); 15 } 16 catch (Error | RuntimeException error) { 17 throw; 18 } 19 catch (Throwable t) { 20 throw new UndeclaredThrowableException(t); 21 } 22 } 23 24 public final String sayHello(final String s) { 25 try { 26 return (String)super.h.invoke(this, $Proxy0.m3, new Object[] { s }); 27 } 28 catch (Error | RuntimeException error) { 29 throw; 30 } 31 catch (Throwable t) { 32 throw new UndeclaredThrowableException(t); 33 } 34 } 35 36 public final String toString() { 37 try { 38 return (String)super.h.invoke(this, $Proxy0.m2, null); 39 } 40 catch (Error | RuntimeException error) { 41 throw; 42 } 43 catch (Throwable t) { 44 throw new UndeclaredThrowableException(t); 45 } 46 } 47 48 public final int hashCode() { 49 try { 50 return (int)super.h.invoke(this, $Proxy0.m0, null); 51 } 52 catch (Error | RuntimeException error) { 53 throw; 54 } 55 catch (Throwable t) { 56 throw new UndeclaredThrowableException(t); 57 } 58 } 59 60 static { 61 try { 62 $Proxy0.m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object")); 63 $Proxy0.m3 = Class.forName("com.cn.zsy.proxy.jdkProxy.IHello").getMethod("sayHello", Class.forName("java.lang.String")); 64 $Proxy0.m2 = Class.forName("java.lang.Object").getMethod("toString", (Class<?>[])new Class[0]); 65 $Proxy0.m0 = Class.forName("java.lang.Object").getMethod("hashCode", (Class<?>[])new Class[0]); 66 } 67 catch (NoSuchMethodException ex) { 68 throw new NoSuchMethodError(ex.getMessage()); 69 } 70 catch (ClassNotFoundException ex2) { 71 throw new NoClassDefFoundError(ex2.getMessage()); 72 } 73 } 74 }
跟源码:
1. java.lang.reflect.Proxy#newProxyInstance() 1.1 sun.misc.ProxyGenerator#generateClassFile() 1.1.1 sun.misc.ProxyGenerator#generateProxyClass() 1.1.1.1 sun.misc.ProxyGenerator#generateClassFile() // line 209,直接生成 java 字节码数组。里面会继承 java.lang.reflect.Proxy
补充:(2020.9.14)
我们也可以直接调用 sun.misc.ProxyGenerator#generateProxyClass(java.lang.String, java.lang.Class<?>[]) 这个静态方法来拿到新生成类的字节码数组,然后将它输出到文件,然后反编译后进行观察
2. cglib 动态代理
cglib 动态代理是通过继承被代理类来实现的。
举例:
1 public class Hello{ 2 public String sayHello(String name) { 3 return "hello " + name; 4 } 5 } 6 7 8 // 为 Hello 类生成代理类 9 public static Object createProxy(final Object originObj){ 10 Enhancer enhancer = new Enhancer(); 11 enhancer.setClassLoader(originObj.getClass().getClassLoader()); 12 enhancer.setSuperclass(originObj.getClass()); 13 Callback[] callbacks = new Callback[]{new MethodInterceptor() { 14 @Override 15 public Object intercept(Object proxyObj, Method method, Object[] args, MethodProxy proxy) throws Throwable { 16 // 被代理的方法执行前可以做一些事情 17 return method.invoke(originObj, args); 18 } 19 }}; 20 enhancer.setCallbacks(callbacks); 21 return enhancer.create(); 22 }
调用流程:
1. net.sf.cglib.proxy.Enhancer#create() 1.1 net.sf.cglib.core.AbstractClassGenerator#generate() // line 329,断点后,将字节码文件输出 // new FileOutputStream("d:\\b.class").getChannel().write(ByteBuffer.wrap(b))
反编译后的代码 如下:
1 public class Hello$$EnhancerByCGLIB$$41f98a2b extends Hello implements Factory 2 { 3 private boolean CGLIB$BOUND; 4 public static Object CGLIB$FACTORY_DATA; 5 private static final ThreadLocal CGLIB$THREAD_CALLBACKS; 6 private static final Callback[] CGLIB$STATIC_CALLBACKS; 7 private MethodInterceptor CGLIB$CALLBACK_0; 8 private static Object CGLIB$CALLBACK_FILTER; 9 private static final Method CGLIB$sayHello$0$Method; 10 private static final MethodProxy CGLIB$sayHello$0$Proxy; 11 private static final Object[] CGLIB$emptyArgs; 12 private static final Method CGLIB$equals$1$Method; 13 private static final MethodProxy CGLIB$equals$1$Proxy; 14 private static final Method CGLIB$toString$2$Method; 15 private static final MethodProxy CGLIB$toString$2$Proxy; 16 private static final Method CGLIB$hashCode$3$Method; 17 private static final MethodProxy CGLIB$hashCode$3$Proxy; 18 private static final Method CGLIB$clone$4$Method; 19 private static final MethodProxy CGLIB$clone$4$Proxy; 20 21 static void CGLIB$STATICHOOK1() { 22 CGLIB$THREAD_CALLBACKS = new ThreadLocal(); 23 CGLIB$emptyArgs = new Object[0]; 24 final Class<?> forName = Class.forName("com.cn.zsy.proxy.cglibProxy.Hello$$EnhancerByCGLIB$$41f98a2b"); 25 final Class<?> forName2; 26 final Method[] methods = ReflectUtils.findMethods(new String[] { "equals", "(Ljava/lang/Object;)Z", "toString", "()Ljava/lang/String;", "hashCode", "()I", "clone", "()Ljava/lang/Object;" }, (forName2 = Class.forName("java.lang.Object")).getDeclaredMethods()); 27 CGLIB$equals$1$Method = methods[0]; 28 CGLIB$equals$1$Proxy = MethodProxy.create((Class)forName2, (Class)forName, "(Ljava/lang/Object;)Z", "equals", "CGLIB$equals$1"); 29 CGLIB$toString$2$Method = methods[1]; 30 CGLIB$toString$2$Proxy = MethodProxy.create((Class)forName2, (Class)forName, "()Ljava/lang/String;", "toString", "CGLIB$toString$2"); 31 CGLIB$hashCode$3$Method = methods[2]; 32 CGLIB$hashCode$3$Proxy = MethodProxy.create((Class)forName2, (Class)forName, "()I", "hashCode", "CGLIB$hashCode$3"); 33 CGLIB$clone$4$Method = methods[3]; 34 CGLIB$clone$4$Proxy = MethodProxy.create((Class)forName2, (Class)forName, "()Ljava/lang/Object;", "clone", "CGLIB$clone$4"); 35 final Class<?> forName3; 36 CGLIB$sayHello$0$Method = ReflectUtils.findMethods(new String[] { "sayHello", "(Ljava/lang/String;)Ljava/lang/String;" }, (forName3 = Class.forName("com.cn.zsy.proxy.cglibProxy.Hello")).getDeclaredMethods())[0]; 37 CGLIB$sayHello$0$Proxy = MethodProxy.create((Class)forName3, (Class)forName, "(Ljava/lang/String;)Ljava/lang/String;", "sayHello", "CGLIB$sayHello$0"); 38 } 39 40 final String CGLIB$sayHello$0(final String s) { 41 return super.sayHello(s); 42 } 43 44 public final String sayHello(final String s) { 45 MethodInterceptor cglib$CALLBACK_2; 46 MethodInterceptor cglib$CALLBACK_0; 47 if ((cglib$CALLBACK_0 = (cglib$CALLBACK_2 = this.CGLIB$CALLBACK_0)) == null) { 48 CGLIB$BIND_CALLBACKS(this); 49 cglib$CALLBACK_2 = (cglib$CALLBACK_0 = this.CGLIB$CALLBACK_0); 50 } 51 if (cglib$CALLBACK_0 != null) { 52 return (String)cglib$CALLBACK_2.intercept((Object)this, Hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$sayHello$0$Method, new Object[] { s }, Hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$sayHello$0$Proxy); 53 } 54 return super.sayHello(s); 55 } 56 57 final boolean CGLIB$equals$1(final Object o) { 58 return super.equals(o); 59 } 60 61 public final boolean equals(final Object o) { 62 MethodInterceptor cglib$CALLBACK_2; 63 MethodInterceptor cglib$CALLBACK_0; 64 if ((cglib$CALLBACK_0 = (cglib$CALLBACK_2 = this.CGLIB$CALLBACK_0)) == null) { 65 CGLIB$BIND_CALLBACKS(this); 66 cglib$CALLBACK_2 = (cglib$CALLBACK_0 = this.CGLIB$CALLBACK_0); 67 } 68 if (cglib$CALLBACK_0 != null) { 69 final Object intercept = cglib$CALLBACK_2.intercept((Object)this, Hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$equals$1$Method, new Object[] { o }, Hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$equals$1$Proxy); 70 return intercept != null && (boolean)intercept; 71 } 72 return super.equals(o); 73 } 74 75 final String CGLIB$toString$2() { 76 return super.toString(); 77 } 78 79 public final String toString() { 80 MethodInterceptor cglib$CALLBACK_2; 81 MethodInterceptor cglib$CALLBACK_0; 82 if ((cglib$CALLBACK_0 = (cglib$CALLBACK_2 = this.CGLIB$CALLBACK_0)) == null) { 83 CGLIB$BIND_CALLBACKS(this); 84 cglib$CALLBACK_2 = (cglib$CALLBACK_0 = this.CGLIB$CALLBACK_0); 85 } 86 if (cglib$CALLBACK_0 != null) { 87 return (String)cglib$CALLBACK_2.intercept((Object)this, Hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$toString$2$Method, Hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$emptyArgs, Hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$toString$2$Proxy); 88 } 89 return super.toString(); 90 } 91 92 final int CGLIB$hashCode$3() { 93 return super.hashCode(); 94 } 95 96 public final int hashCode() { 97 MethodInterceptor cglib$CALLBACK_2; 98 MethodInterceptor cglib$CALLBACK_0; 99 if ((cglib$CALLBACK_0 = (cglib$CALLBACK_2 = this.CGLIB$CALLBACK_0)) == null) { 100 CGLIB$BIND_CALLBACKS(this); 101 cglib$CALLBACK_2 = (cglib$CALLBACK_0 = this.CGLIB$CALLBACK_0); 102 } 103 if (cglib$CALLBACK_0 != null) { 104 final Object intercept = cglib$CALLBACK_2.intercept((Object)this, Hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$hashCode$3$Method, Hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$emptyArgs, Hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$hashCode$3$Proxy); 105 return (intercept == null) ? 0 : ((Number)intercept).intValue(); 106 } 107 return super.hashCode(); 108 } 109 110 final Object CGLIB$clone$4() throws CloneNotSupportedException { 111 return super.clone(); 112 } 113 114 protected final Object clone() throws CloneNotSupportedException { 115 MethodInterceptor cglib$CALLBACK_2; 116 MethodInterceptor cglib$CALLBACK_0; 117 if ((cglib$CALLBACK_0 = (cglib$CALLBACK_2 = this.CGLIB$CALLBACK_0)) == null) { 118 CGLIB$BIND_CALLBACKS(this); 119 cglib$CALLBACK_2 = (cglib$CALLBACK_0 = this.CGLIB$CALLBACK_0); 120 } 121 if (cglib$CALLBACK_0 != null) { 122 return cglib$CALLBACK_2.intercept((Object)this, Hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$clone$4$Method, Hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$emptyArgs, Hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$clone$4$Proxy); 123 } 124 return super.clone(); 125 } 126 127 public static MethodProxy CGLIB$findMethodProxy(final Signature signature) { 128 final String string = signature.toString(); 129 switch (string.hashCode()) { 130 case -1816210712: { 131 if (string.equals("sayHello(Ljava/lang/String;)Ljava/lang/String;")) { 132 return Hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$sayHello$0$Proxy; 133 } 134 break; 135 } 136 case -508378822: { 137 if (string.equals("clone()Ljava/lang/Object;")) { 138 return Hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$clone$4$Proxy; 139 } 140 break; 141 } 142 case 1826985398: { 143 if (string.equals("equals(Ljava/lang/Object;)Z")) { 144 return Hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$equals$1$Proxy; 145 } 146 break; 147 } 148 case 1913648695: { 149 if (string.equals("toString()Ljava/lang/String;")) { 150 return Hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$toString$2$Proxy; 151 } 152 break; 153 } 154 case 1984935277: { 155 if (string.equals("hashCode()I")) { 156 return Hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$hashCode$3$Proxy; 157 } 158 break; 159 } 160 } 161 return null; 162 } 163 164 public Hello$$EnhancerByCGLIB$$41f98a2b() { 165 CGLIB$BIND_CALLBACKS(this); 166 } 167 168 public static void CGLIB$SET_THREAD_CALLBACKS(final Callback[] array) { 169 Hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$THREAD_CALLBACKS.set(array); 170 } 171 172 public static void CGLIB$SET_STATIC_CALLBACKS(final Callback[] cglib$STATIC_CALLBACKS) { 173 CGLIB$STATIC_CALLBACKS = cglib$STATIC_CALLBACKS; 174 } 175 176 private static final void CGLIB$BIND_CALLBACKS(final Object o) { 177 final Hello$$EnhancerByCGLIB$$41f98a2b hello$$EnhancerByCGLIB$$41f98a2b = (Hello$$EnhancerByCGLIB$$41f98a2b)o; 178 if (!hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$BOUND) { 179 hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$BOUND = true; 180 Object o2; 181 if ((o2 = Hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$THREAD_CALLBACKS.get()) != null || (o2 = Hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$STATIC_CALLBACKS) != null) { 182 hello$$EnhancerByCGLIB$$41f98a2b.CGLIB$CALLBACK_0 = (MethodInterceptor)((Callback[])o2)[0]; 183 } 184 } 185 } 186 187 public Object newInstance(final Callback[] array) { 188 CGLIB$SET_THREAD_CALLBACKS(array); 189 final Hello$$EnhancerByCGLIB$$41f98a2b hello$$EnhancerByCGLIB$$41f98a2b = new Hello$$EnhancerByCGLIB$$41f98a2b(); 190 CGLIB$SET_THREAD_CALLBACKS(null); 191 return hello$$EnhancerByCGLIB$$41f98a2b; 192 } 193 194 public Object newInstance(final Callback callback) { 195 CGLIB$SET_THREAD_CALLBACKS(new Callback[] { callback }); 196 final Hello$$EnhancerByCGLIB$$41f98a2b hello$$EnhancerByCGLIB$$41f98a2b = new Hello$$EnhancerByCGLIB$$41f98a2b(); 197 CGLIB$SET_THREAD_CALLBACKS(null); 198 return hello$$EnhancerByCGLIB$$41f98a2b; 199 } 200 201 public Object newInstance(final Class[] array, final Object[] array2, final Callback[] array3) { 202 CGLIB$SET_THREAD_CALLBACKS(array3); 203 switch (array.length) { 204 case 0: { 205 final Hello$$EnhancerByCGLIB$$41f98a2b hello$$EnhancerByCGLIB$$41f98a2b = new Hello$$EnhancerByCGLIB$$41f98a2b(); 206 CGLIB$SET_THREAD_CALLBACKS(null); 207 return hello$$EnhancerByCGLIB$$41f98a2b; 208 } 209 default: { 210 throw new IllegalArgumentException("Constructor not found"); 211 } 212 } 213 } 214 215 public Callback getCallback(final int n) { 216 CGLIB$BIND_CALLBACKS(this); 217 Object cglib$CALLBACK_0 = null; 218 switch (n) { 219 case 0: { 220 cglib$CALLBACK_0 = this.CGLIB$CALLBACK_0; 221 break; 222 } 223 default: { 224 cglib$CALLBACK_0 = null; 225 break; 226 } 227 } 228 return (Callback)cglib$CALLBACK_0; 229 } 230 231 public void setCallback(final int n, final Callback callback) { 232 switch (n) { 233 case 0: { 234 this.CGLIB$CALLBACK_0 = (MethodInterceptor)callback; 235 break; 236 } 237 } 238 } 239 240 public Callback[] getCallbacks() { 241 CGLIB$BIND_CALLBACKS(this); 242 return new Callback[] { this.CGLIB$CALLBACK_0 }; 243 } 244 245 public void setCallbacks(final Callback[] array) { 246 this.CGLIB$CALLBACK_0 = (MethodInterceptor)array[0]; 247 } 248 249 static { 250 CGLIB$STATICHOOK1(); 251 } 252 }
注意:cglib 也可以直接对接口生成代理
1 Enhancer enhancer = new Enhancer(); 2 enhancer.setClassLoader(IHello.class.getClassLoader()); 3 enhancer.setSuperclass(IHello.class); 4 Callback[] callbacks = new Callback[]{new MethodInterceptor() { 5 @Override 6 public Object intercept(Object proxyObj, Method method, Object[] args, MethodProxy proxy) throws Throwable { 7 // 由于是对接口生成的代理,这里可以做一些通用逻辑 8 // 比如:mybatis 的 mapper 类就是一个接口类,没有具体实现 9 return ...; 10 } 11 }}; 12 enhancer.setCallbacks(callbacks); 13 enhancer.create();
反编译代理类:
1 public class IHello$$EnhancerByCGLIB$$6e686db0 implements IHello, Factory 2 { 3 private boolean CGLIB$BOUND; 4 public static Object CGLIB$FACTORY_DATA; 5 private static final ThreadLocal CGLIB$THREAD_CALLBACKS; 6 private static final Callback[] CGLIB$STATIC_CALLBACKS; 7 private MethodInterceptor CGLIB$CALLBACK_0; 8 private static Object CGLIB$CALLBACK_FILTER; 9 private static final Method CGLIB$equals$0$Method; 10 private static final MethodProxy CGLIB$equals$0$Proxy; 11 private static final Object[] CGLIB$emptyArgs; 12 private static final Method CGLIB$toString$1$Method; 13 private static final MethodProxy CGLIB$toString$1$Proxy; 14 private static final Method CGLIB$hashCode$2$Method; 15 private static final MethodProxy CGLIB$hashCode$2$Proxy; 16 private static final Method CGLIB$clone$3$Method; 17 private static final MethodProxy CGLIB$clone$3$Proxy; 18 private static final Method CGLIB$sayHello$4$Method; 19 private static final MethodProxy CGLIB$sayHello$4$Proxy; 20 21 static void CGLIB$STATICHOOK1() { 22 CGLIB$THREAD_CALLBACKS = new ThreadLocal(); 23 CGLIB$emptyArgs = new Object[0]; 24 final Class<?> forName = Class.forName("com.cn.zsy.proxy.jdkProxy.IHello$$EnhancerByCGLIB$$6e686db0"); 25 final Class<?> forName2; 26 final Method[] methods = ReflectUtils.findMethods(new String[] { "equals", "(Ljava/lang/Object;)Z", "toString", "()Ljava/lang/String;", "hashCode", "()I", "clone", "()Ljava/lang/Object;" }, (forName2 = Class.forName("java.lang.Object")).getDeclaredMethods()); 27 CGLIB$equals$0$Method = methods[0]; 28 CGLIB$equals$0$Proxy = MethodProxy.create((Class)forName2, (Class)forName, "(Ljava/lang/Object;)Z", "equals", "CGLIB$equals$0"); 29 CGLIB$toString$1$Method = methods[1]; 30 CGLIB$toString$1$Proxy = MethodProxy.create((Class)forName2, (Class)forName, "()Ljava/lang/String;", "toString", "CGLIB$toString$1"); 31 CGLIB$hashCode$2$Method = methods[2]; 32 CGLIB$hashCode$2$Proxy = MethodProxy.create((Class)forName2, (Class)forName, "()I", "hashCode", "CGLIB$hashCode$2"); 33 CGLIB$clone$3$Method = methods[3]; 34 CGLIB$clone$3$Proxy = MethodProxy.create((Class)forName2, (Class)forName, "()Ljava/lang/Object;", "clone", "CGLIB$clone$3"); 35 final Class<?> forName3; 36 CGLIB$sayHello$4$Method = ReflectUtils.findMethods(new String[] { "sayHello", "(Ljava/lang/String;)Ljava/lang/String;" }, (forName3 = Class.forName("com.cn.zsy.proxy.jdkProxy.IHello")).getDeclaredMethods())[0]; 37 CGLIB$sayHello$4$Proxy = MethodProxy.create((Class)forName3, (Class)forName, "(Ljava/lang/String;)Ljava/lang/String;", "sayHello", "CGLIB$sayHello$4"); 38 } 39 40 final boolean CGLIB$equals$0(final Object o) { 41 return super.equals(o); 42 } 43 44 public final boolean equals(final Object o) { 45 MethodInterceptor cglib$CALLBACK_2; 46 MethodInterceptor cglib$CALLBACK_0; 47 if ((cglib$CALLBACK_0 = (cglib$CALLBACK_2 = this.CGLIB$CALLBACK_0)) == null) { 48 CGLIB$BIND_CALLBACKS(this); 49 cglib$CALLBACK_2 = (cglib$CALLBACK_0 = this.CGLIB$CALLBACK_0); 50 } 51 if (cglib$CALLBACK_0 != null) { 52 final Object intercept = cglib$CALLBACK_2.intercept((Object)this, IHello$$EnhancerByCGLIB$$6e686db0.CGLIB$equals$0$Method, new Object[] { o }, IHello$$EnhancerByCGLIB$$6e686db0.CGLIB$equals$0$Proxy); 53 return intercept != null && (boolean)intercept; 54 } 55 return super.equals(o); 56 } 57 58 final String CGLIB$toString$1() { 59 return super.toString(); 60 } 61 62 public final String toString() { 63 MethodInterceptor cglib$CALLBACK_2; 64 MethodInterceptor cglib$CALLBACK_0; 65 if ((cglib$CALLBACK_0 = (cglib$CALLBACK_2 = this.CGLIB$CALLBACK_0)) == null) { 66 CGLIB$BIND_CALLBACKS(this); 67 cglib$CALLBACK_2 = (cglib$CALLBACK_0 = this.CGLIB$CALLBACK_0); 68 } 69 if (cglib$CALLBACK_0 != null) { 70 return (String)cglib$CALLBACK_2.intercept((Object)this, IHello$$EnhancerByCGLIB$$6e686db0.CGLIB$toString$1$Method, IHello$$EnhancerByCGLIB$$6e686db0.CGLIB$emptyArgs, IHello$$EnhancerByCGLIB$$6e686db0.CGLIB$toString$1$Proxy); 71 } 72 return super.toString(); 73 } 74 75 final int CGLIB$hashCode$2() { 76 return super.hashCode(); 77 } 78 79 public final int hashCode() { 80 MethodInterceptor cglib$CALLBACK_2; 81 MethodInterceptor cglib$CALLBACK_0; 82 if ((cglib$CALLBACK_0 = (cglib$CALLBACK_2 = this.CGLIB$CALLBACK_0)) == null) { 83 CGLIB$BIND_CALLBACKS(this); 84 cglib$CALLBACK_2 = (cglib$CALLBACK_0 = this.CGLIB$CALLBACK_0); 85 } 86 if (cglib$CALLBACK_0 != null) { 87 final Object intercept = cglib$CALLBACK_2.intercept((Object)this, IHello$$EnhancerByCGLIB$$6e686db0.CGLIB$hashCode$2$Method, IHello$$EnhancerByCGLIB$$6e686db0.CGLIB$emptyArgs, IHello$$EnhancerByCGLIB$$6e686db0.CGLIB$hashCode$2$Proxy); 88 return (intercept == null) ? 0 : ((Number)intercept).intValue(); 89 } 90 return super.hashCode(); 91 } 92 93 final Object CGLIB$clone$3() throws CloneNotSupportedException { 94 return super.clone(); 95 } 96 97 protected final Object clone() throws CloneNotSupportedException { 98 MethodInterceptor cglib$CALLBACK_2; 99 MethodInterceptor cglib$CALLBACK_0; 100 if ((cglib$CALLBACK_0 = (cglib$CALLBACK_2 = this.CGLIB$CALLBACK_0)) == null) { 101 CGLIB$BIND_CALLBACKS(this); 102 cglib$CALLBACK_2 = (cglib$CALLBACK_0 = this.CGLIB$CALLBACK_0); 103 } 104 if (cglib$CALLBACK_0 != null) { 105 return cglib$CALLBACK_2.intercept((Object)this, IHello$$EnhancerByCGLIB$$6e686db0.CGLIB$clone$3$Method, IHello$$EnhancerByCGLIB$$6e686db0.CGLIB$emptyArgs, IHello$$EnhancerByCGLIB$$6e686db0.CGLIB$clone$3$Proxy); 106 } 107 return super.clone(); 108 } 109 110 final String CGLIB$sayHello$4(final String s) { 111 return super.sayHello(s); 112 } 113 114 public final String sayHello(final String s) { 115 MethodInterceptor cglib$CALLBACK_2; 116 MethodInterceptor cglib$CALLBACK_0; 117 if ((cglib$CALLBACK_0 = (cglib$CALLBACK_2 = this.CGLIB$CALLBACK_0)) == null) { 118 CGLIB$BIND_CALLBACKS(this); 119 cglib$CALLBACK_2 = (cglib$CALLBACK_0 = this.CGLIB$CALLBACK_0); 120 } 121 if (cglib$CALLBACK_0 != null) { 122 return (String)cglib$CALLBACK_2.intercept((Object)this, IHello$$EnhancerByCGLIB$$6e686db0.CGLIB$sayHello$4$Method, new Object[] { s }, IHello$$EnhancerByCGLIB$$6e686db0.CGLIB$sayHello$4$Proxy); 123 } 124 return super.sayHello(s); 125 } 126 127 public static MethodProxy CGLIB$findMethodProxy(final Signature signature) { 128 final String string = signature.toString(); 129 switch (string.hashCode()) { 130 case -1816210712: { 131 if (string.equals("sayHello(Ljava/lang/String;)Ljava/lang/String;")) { 132 return IHello$$EnhancerByCGLIB$$6e686db0.CGLIB$sayHello$4$Proxy; 133 } 134 break; 135 } 136 case -508378822: { 137 if (string.equals("clone()Ljava/lang/Object;")) { 138 return IHello$$EnhancerByCGLIB$$6e686db0.CGLIB$clone$3$Proxy; 139 } 140 break; 141 } 142 case 1826985398: { 143 if (string.equals("equals(Ljava/lang/Object;)Z")) { 144 return IHello$$EnhancerByCGLIB$$6e686db0.CGLIB$equals$0$Proxy; 145 } 146 break; 147 } 148 case 1913648695: { 149 if (string.equals("toString()Ljava/lang/String;")) { 150 return IHello$$EnhancerByCGLIB$$6e686db0.CGLIB$toString$1$Proxy; 151 } 152 break; 153 } 154 case 1984935277: { 155 if (string.equals("hashCode()I")) { 156 return IHello$$EnhancerByCGLIB$$6e686db0.CGLIB$hashCode$2$Proxy; 157 } 158 break; 159 } 160 } 161 return null; 162 } 163 164 public IHello$$EnhancerByCGLIB$$6e686db0() { 165 CGLIB$BIND_CALLBACKS(this); 166 } 167 168 public static void CGLIB$SET_THREAD_CALLBACKS(final Callback[] array) { 169 IHello$$EnhancerByCGLIB$$6e686db0.CGLIB$THREAD_CALLBACKS.set(array); 170 } 171 172 public static void CGLIB$SET_STATIC_CALLBACKS(final Callback[] cglib$STATIC_CALLBACKS) { 173 CGLIB$STATIC_CALLBACKS = cglib$STATIC_CALLBACKS; 174 } 175 176 private static final void CGLIB$BIND_CALLBACKS(final Object o) { 177 final IHello$$EnhancerByCGLIB$$6e686db0 hello$$EnhancerByCGLIB$$6e686db0 = (IHello$$EnhancerByCGLIB$$6e686db0)o; 178 if (!hello$$EnhancerByCGLIB$$6e686db0.CGLIB$BOUND) { 179 hello$$EnhancerByCGLIB$$6e686db0.CGLIB$BOUND = true; 180 Object o2; 181 if ((o2 = IHello$$EnhancerByCGLIB$$6e686db0.CGLIB$THREAD_CALLBACKS.get()) != null || (o2 = IHello$$EnhancerByCGLIB$$6e686db0.CGLIB$STATIC_CALLBACKS) != null) { 182 hello$$EnhancerByCGLIB$$6e686db0.CGLIB$CALLBACK_0 = (MethodInterceptor)((Callback[])o2)[0]; 183 } 184 } 185 } 186 187 public Object newInstance(final Callback[] array) { 188 CGLIB$SET_THREAD_CALLBACKS(array); 189 final IHello$$EnhancerByCGLIB$$6e686db0 hello$$EnhancerByCGLIB$$6e686db0 = new IHello$$EnhancerByCGLIB$$6e686db0(); 190 CGLIB$SET_THREAD_CALLBACKS(null); 191 return hello$$EnhancerByCGLIB$$6e686db0; 192 } 193 194 public Object newInstance(final Callback callback) { 195 CGLIB$SET_THREAD_CALLBACKS(new Callback[] { callback }); 196 final IHello$$EnhancerByCGLIB$$6e686db0 hello$$EnhancerByCGLIB$$6e686db0 = new IHello$$EnhancerByCGLIB$$6e686db0(); 197 CGLIB$SET_THREAD_CALLBACKS(null); 198 return hello$$EnhancerByCGLIB$$6e686db0; 199 } 200 201 public Object newInstance(final Class[] array, final Object[] array2, final Callback[] array3) { 202 CGLIB$SET_THREAD_CALLBACKS(array3); 203 switch (array.length) { 204 case 0: { 205 final IHello$$EnhancerByCGLIB$$6e686db0 hello$$EnhancerByCGLIB$$6e686db0 = new IHello$$EnhancerByCGLIB$$6e686db0(); 206 CGLIB$SET_THREAD_CALLBACKS(null); 207 return hello$$EnhancerByCGLIB$$6e686db0; 208 } 209 default: { 210 throw new IllegalArgumentException("Constructor not found"); 211 } 212 } 213 } 214 215 public Callback getCallback(final int n) { 216 CGLIB$BIND_CALLBACKS(this); 217 Object cglib$CALLBACK_0 = null; 218 switch (n) { 219 case 0: { 220 cglib$CALLBACK_0 = this.CGLIB$CALLBACK_0; 221 break; 222 } 223 default: { 224 cglib$CALLBACK_0 = null; 225 break; 226 } 227 } 228 return (Callback)cglib$CALLBACK_0; 229 } 230 231 public void setCallback(final int n, final Callback callback) { 232 switch (n) { 233 case 0: { 234 this.CGLIB$CALLBACK_0 = (MethodInterceptor)callback; 235 break; 236 } 237 } 238 } 239 240 public Callback[] getCallbacks() { 241 CGLIB$BIND_CALLBACKS(this); 242 return new Callback[] { this.CGLIB$CALLBACK_0 }; 243 } 244 245 public void setCallbacks(final Callback[] array) { 246 this.CGLIB$CALLBACK_0 = (MethodInterceptor)array[0]; 247 } 248 249 static { 250 CGLIB$STATICHOOK1(); 251 } 252 }