Cglib代理原理剖析

package Cglib第三方代理;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;public class DynamicProxy implements MethodInterceptor {//真实对象Object targetObject;public Object getProxyObject(Object object){this.targetObject = object;//增强器,动态代码生成器Enhancer enhancer = new Enhancer();//回调方法enhancer.setCallback(this);//设置生成类的父类类型enhancer.setSuperclass(targetObject.getClass());//动态生成字节码并返回代理对象return enhancer.create();}//拦截方法@Overridepublic Object intercept(Object arg0, Method arg1, Object[] args, MethodProxy methodProxy) throws Throwable {System.out.println("Hello,I am the weaved method before");Object result = methodProxy.invoke(targetObject,args);System.out.println("Hello,I am the weaved method after");return result;}}
class RealClass{public void hah(){System.out.println("我是真实类要处理的东东,也叫切入点,快来增强我");}
}
package Cglib第三方代理;import java.io.FileOutputStream;
import java.io.IOException;import org.junit.Test;import net.sf.cglib.core.DebuggingClassWriter;
import sun.misc.ProxyGenerator;public class TestCglibMain {//   RealClass realObject = (RealClass) new DynamicProxy().getProxyObject(new RealClass());
//  @Test
//  public void test() throws IOException{
//      realObject.hah();//System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "H:\\Hadoop_eclipse\\eclipse-jee-mars-2-win32-x86_64\\剑指Offer\\反射详解\\bin\\cgliballclass");//      String path = "H:/Hadoop_eclipse/eclipse-jee-mars-2-win32-x86_64/剑指Offer/反射详解/bin/cgliballclass/$proxy1.class";
//      byte[] classFile = //new byte[1024];
//              ProxyGenerator.generateProxyClass("$Proxy1",
//                      realObject.getClass().getClasses());
//        FileOutputStream out = null;
//
//        try {
//            out = new FileOutputStream(path);
//            out.write(classFile);
//            out.flush();
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            try {
//                out.close();
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }//   }public static void main(String[] args) throws IOException {RealClass realObject = (RealClass) new DynamicProxy().getProxyObject(new RealClass());realObject.hah();//System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "H:\\Hadoop_eclipse\\eclipse-jee-mars-2-win32-x86_64\\剑指Offer\\反射详解\\bin\\cgliballclass");System.in.read();}
}
package Cglib第三方代理;import java.lang.reflect.Method;
import net.sf.cglib.core.ReflectUtils;
import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Factory;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;public class RealClass$$EnhancerByCGLIB$$afcc55acextends RealClassimplements Factory
{private boolean CGLIB$BOUND;private static final ThreadLocal CGLIB$THREAD_CALLBACKS;private static final Callback[] CGLIB$STATIC_CALLBACKS;private MethodInterceptor CGLIB$CALLBACK_0;private static final Method CGLIB$hah$0$Method;private static final MethodProxy CGLIB$hah$0$Proxy;private static final Object[] CGLIB$emptyArgs;private static final Method CGLIB$finalize$1$Method;private static final MethodProxy CGLIB$finalize$1$Proxy;private static final Method CGLIB$equals$2$Method;private static final MethodProxy CGLIB$equals$2$Proxy;private static final Method CGLIB$toString$3$Method;private static final MethodProxy CGLIB$toString$3$Proxy;private static final Method CGLIB$hashCode$4$Method;private static final MethodProxy CGLIB$hashCode$4$Proxy;private static final Method CGLIB$clone$5$Method;private static final MethodProxy CGLIB$clone$5$Proxy;public RealClass$$EnhancerByCGLIB$$afcc55ac(){CGLIB$BIND_CALLBACKS(this);}static {}protected final void finalize()throws Throwable{MethodInterceptor tmp4_1 = this.CGLIB$CALLBACK_0;if (tmp4_1 == null){tmp4_1;CGLIB$BIND_CALLBACKS(this);}if (this.CGLIB$CALLBACK_0 != null) {return;}super.finalize();}public final boolean equals(Object paramObject){MethodInterceptor tmp4_1 = this.CGLIB$CALLBACK_0;if (tmp4_1 == null){tmp4_1;CGLIB$BIND_CALLBACKS(this);}MethodInterceptor tmp17_14 = this.CGLIB$CALLBACK_0;if (tmp17_14 != null){Object tmp41_36 = tmp17_14.intercept(this, CGLIB$equals$2$Method, new Object[] { paramObject }, CGLIB$equals$2$Proxy);tmp41_36;return tmp41_36 == null ? false : ((Boolean)tmp41_36).booleanValue();}return super.equals(paramObject);}public final String toString(){MethodInterceptor tmp4_1 = this.CGLIB$CALLBACK_0;if (tmp4_1 == null){tmp4_1;CGLIB$BIND_CALLBACKS(this);}MethodInterceptor tmp17_14 = this.CGLIB$CALLBACK_0;if (tmp17_14 != null) {return (String)tmp17_14.intercept(this, CGLIB$toString$3$Method, CGLIB$emptyArgs, CGLIB$toString$3$Proxy);}return super.toString();}public final int hashCode(){MethodInterceptor tmp4_1 = this.CGLIB$CALLBACK_0;if (tmp4_1 == null){tmp4_1;CGLIB$BIND_CALLBACKS(this);}MethodInterceptor tmp17_14 = this.CGLIB$CALLBACK_0;if (tmp17_14 != null){Object tmp36_31 = tmp17_14.intercept(this, CGLIB$hashCode$4$Method, CGLIB$emptyArgs, CGLIB$hashCode$4$Proxy);tmp36_31;return tmp36_31 == null ? 0 : ((Number)tmp36_31).intValue();}return super.hashCode();}protected final Object clone()throws CloneNotSupportedException{MethodInterceptor tmp4_1 = this.CGLIB$CALLBACK_0;if (tmp4_1 == null){tmp4_1;CGLIB$BIND_CALLBACKS(this);}MethodInterceptor tmp17_14 = this.CGLIB$CALLBACK_0;if (tmp17_14 != null) {return tmp17_14.intercept(this, CGLIB$clone$5$Method, CGLIB$emptyArgs, CGLIB$clone$5$Proxy);}return super.clone();}/* Error */public Object newInstance(Class[] arg1, Object[] arg2, Callback[] arg3){// Byte code://   0: aload_3//   1: invokestatic 206  Cglib第三方代理/RealClass$$EnhancerByCGLIB$$afcc55ac:CGLIB$SET_THREAD_CALLBACKS  ([Lnet/sf/cglib/proxy/Callback;)V//   4: new 2  Cglib第三方代理/RealClass$$EnhancerByCGLIB$$afcc55ac//   7: dup//   8: aload_1//   9: dup//   10: arraylength//   11: tableswitch    default:+24->35, 0:+17->28//   28: pop//   29: invokespecial 207    Cglib第三方代理/RealClass$$EnhancerByCGLIB$$afcc55ac:<init>    ()V//   32: goto +17 -> 49//   35: goto +3 -> 38//   38: pop//   39: new 213    java/lang/IllegalArgumentException//   42: dup//   43: ldc -41//   45: invokespecial 218    java/lang/IllegalArgumentException:<init> (Ljava/lang/String;)V//   48: athrow//   49: aconst_null//   50: invokestatic 206   Cglib第三方代理/RealClass$$EnhancerByCGLIB$$afcc55ac:CGLIB$SET_THREAD_CALLBACKS  ([Lnet/sf/cglib/proxy/Callback;)V//   53: areturn}public Object newInstance(Callback[] paramArrayOfCallback){CGLIB$SET_THREAD_CALLBACKS(paramArrayOfCallback);CGLIB$SET_THREAD_CALLBACKS(null);return new afcc55ac();}public Object newInstance(Callback paramCallback){CGLIB$SET_THREAD_CALLBACKS(new Callback[] { paramCallback });CGLIB$SET_THREAD_CALLBACKS(null);return new afcc55ac();}public final void hah(){MethodInterceptor tmp4_1 = this.CGLIB$CALLBACK_0;if (tmp4_1 == null){tmp4_1;CGLIB$BIND_CALLBACKS(this);}if (this.CGLIB$CALLBACK_0 != null) {return;}super.hah();}public void setCallbacks(Callback[] paramArrayOfCallback){this.CGLIB$CALLBACK_0 = ((MethodInterceptor)paramArrayOfCallback[0]);}public void setCallback(int paramInt, Callback paramCallback){switch (paramInt){case 0: this.CGLIB$CALLBACK_0 = ((MethodInterceptor)paramCallback);break;}}public static void CGLIB$SET_STATIC_CALLBACKS(Callback[] paramArrayOfCallback){CGLIB$STATIC_CALLBACKS = paramArrayOfCallback;}public static void CGLIB$SET_THREAD_CALLBACKS(Callback[] paramArrayOfCallback){CGLIB$THREAD_CALLBACKS.set(paramArrayOfCallback);}public Callback getCallback(int paramInt){CGLIB$BIND_CALLBACKS(this);switch (paramInt){case 0: break;}return null;}public Callback[] getCallbacks(){CGLIB$BIND_CALLBACKS(this);return new Callback[] { this.CGLIB$CALLBACK_0 };}final int CGLIB$hashCode$4(){return super.hashCode();}final void CGLIB$hah$0(){super.hah();}final String CGLIB$toString$3(){return super.toString();}final boolean CGLIB$equals$2(Object paramObject){return super.equals(paramObject);}final void CGLIB$finalize$1()throws Throwable{super.finalize();}final Object CGLIB$clone$5()throws CloneNotSupportedException{return super.clone();}private static final void CGLIB$BIND_CALLBACKS(Object paramObject){afcc55ac localafcc55ac = (afcc55ac)paramObject;if (!localafcc55ac.CGLIB$BOUND){localafcc55ac.CGLIB$BOUND = true;Object tmp23_20 = CGLIB$THREAD_CALLBACKS.get();if (tmp23_20 == null){tmp23_20;CGLIB$STATIC_CALLBACKS;}localafcc55ac.CGLIB$CALLBACK_0 = (tmp31_28 == null ? tmp31_28 : (MethodInterceptor)((Callback[])tmp23_20)[0]);}}static void CGLIB$STATICHOOK1(){CGLIB$THREAD_CALLBACKS = new ThreadLocal();CGLIB$emptyArgs = new Object[0];Class localClass1 = Class.forName("Cglib第三方代理.RealClass$$EnhancerByCGLIB$$afcc55ac");Class localClass2;Method[] tmp50_47 = ReflectUtils.findMethods(new String[] { "hah", "()V" }, (localClass2 = Class.forName("Cglib第三方代理.RealClass")).getDeclaredMethods());CGLIB$hah$0$Method = tmp50_47[0];CGLIB$hah$0$Proxy = MethodProxy.create(localClass2, localClass1, "()V", "hah", "CGLIB$hah$0");tmp50_47;Method[] tmp143_140 = ReflectUtils.findMethods(new String[] { "finalize", "()V", "equals", "(Ljava/lang/Object;)Z", "toString", "()Ljava/lang/String;", "hashCode", "()I", "clone", "()Ljava/lang/Object;" }, (localClass2 = Class.forName("java.lang.Object")).getDeclaredMethods());CGLIB$finalize$1$Method = tmp143_140[0];CGLIB$finalize$1$Proxy = MethodProxy.create(localClass2, localClass1, "()V", "finalize", "CGLIB$finalize$1");Method[] tmp163_143 = tmp143_140;CGLIB$equals$2$Method = tmp163_143[1];CGLIB$equals$2$Proxy = MethodProxy.create(localClass2, localClass1, "(Ljava/lang/Object;)Z", "equals", "CGLIB$equals$2");Method[] tmp183_163 = tmp163_143;CGLIB$toString$3$Method = tmp183_163[2];CGLIB$toString$3$Proxy = MethodProxy.create(localClass2, localClass1, "()Ljava/lang/String;", "toString", "CGLIB$toString$3");Method[] tmp203_183 = tmp183_163;CGLIB$hashCode$4$Method = tmp203_183[3];CGLIB$hashCode$4$Proxy = MethodProxy.create(localClass2, localClass1, "()I", "hashCode", "CGLIB$hashCode$4");Method[] tmp223_203 = tmp203_183;CGLIB$clone$5$Method = tmp223_203[4];CGLIB$clone$5$Proxy = MethodProxy.create(localClass2, localClass1, "()Ljava/lang/Object;", "clone", "CGLIB$clone$5");tmp223_203;return;}/* Error */public static MethodProxy CGLIB$findMethodProxy(net.sf.cglib.core.Signature arg0){// Byte code://   0: aload_0//   1: invokevirtual 128 java/lang/Object:toString   ()Ljava/lang/String;//   4: dup//   5: invokevirtual 129    java/lang/Object:hashCode   ()I//   8: lookupswitch default:+132->140, -1574182249:+60->68, -1224815994:+72->80, -508378822:+84->92, 1826985398:+96->104, 1913648695:+108->116, 1984935277:+120->128//   68: ldc -125//   70: invokevirtual 132 java/lang/Object:equals (Ljava/lang/Object;)Z//   73: ifeq +68 -> 141//   76: getstatic 64  Cglib第三方代理/RealClass$$EnhancerByCGLIB$$afcc55ac:CGLIB$finalize$1$Proxy  Lnet/sf/cglib/proxy/MethodProxy;//   79: areturn//   80: ldc -122//   82: invokevirtual 132 java/lang/Object:equals (Ljava/lang/Object;)Z//   85: ifeq +56 -> 141//   88: getstatic 46  Cglib第三方代理/RealClass$$EnhancerByCGLIB$$afcc55ac:CGLIB$hah$0$Proxy   Lnet/sf/cglib/proxy/MethodProxy;//   91: areturn//   92: ldc -120//   94: invokevirtual 132 java/lang/Object:equals (Ljava/lang/Object;)Z//   97: ifeq +44 -> 141//   100: getstatic 125    Cglib第三方代理/RealClass$$EnhancerByCGLIB$$afcc55ac:CGLIB$clone$5$Proxy Lnet/sf/cglib/proxy/MethodProxy;//   103: areturn//   104: ldc -118//   106: invokevirtual 132  java/lang/Object:equals (Ljava/lang/Object;)Z//   109: ifeq +32 -> 141//   112: getstatic 77    Cglib第三方代理/RealClass$$EnhancerByCGLIB$$afcc55ac:CGLIB$equals$2$Proxy    Lnet/sf/cglib/proxy/MethodProxy;//   115: areturn//   116: ldc -116//   118: invokevirtual 132  java/lang/Object:equals (Ljava/lang/Object;)Z//   121: ifeq +20 -> 141//   124: getstatic 94    Cglib第三方代理/RealClass$$EnhancerByCGLIB$$afcc55ac:CGLIB$toString$3$Proxy  Lnet/sf/cglib/proxy/MethodProxy;//   127: areturn//   128: ldc -114//   130: invokevirtual 132  java/lang/Object:equals (Ljava/lang/Object;)Z//   133: ifeq +8 -> 141//   136: getstatic 107    Cglib第三方代理/RealClass$$EnhancerByCGLIB$$afcc55ac:CGLIB$hashCode$4$Proxy  Lnet/sf/cglib/proxy/MethodProxy;//   139: areturn//   140: pop//   141: aconst_null//   142: areturn}
}

JDK的代理必须是真实类有接口实现,代理类有InvocationHandler实现,代理类组合真实类有初始化真实类的构造器,
因为Proxy.newInstance需要类加载器,接口class类型,InvocationHandler实现类作为参数传入

Cglib的代理必须是真实类非final,代理类实现MethodInceptor接口,会创建真实类的子类,子类调用某一方法时,先判断

public final void hah()
  {
    MethodInterceptor tmp4_1 = this.CGLIB$CALLBACK_0;
    if (tmp4_1 == null)
    {
      tmp4_1;
      CGLIB$BIND_CALLBACKS(this);
    }
    if (this.CGLIB$CALLBACK_0 != null) {
      return;
    }
    super.hah();
  }

可参考https://www.jianshu.com/p/9a61af393e41?from=timeline&isappinstalled=0

Cglib代理原理剖析相关推荐

  1. java动态代理原理剖析

    首先来谈为什么需要代理. 比如我有一个接口如下 public interface Moveable {void move();} 它有一个move方法.现在我有这样一个需求,当我要通过子类实现该接口调 ...

  2. AOP源码——JDK、CGLIB代理原理

    Around.class, Before.class, After.class, AfterReturning.class, AfterThrowing.class 这里重点是执行的递归流程!非常漂亮 ...

  3. 深入理解Java Proxy和CGLIB动态代理原理

    点击上方关注,每天进步一点点 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译 ...

  4. jdk动态代理实例和cglib动态代理实例_CGLib 动态代理 原理解析

    JDK 动态代理实现与原理 首先来看一段CGLib代理的测试代码(MethodInterceptor的测试, 其他类型这里不做展开了). Util类的代码在后面给出的码云片段中 public 下面的输 ...

  5. Java Proxy和CGLIB动态代理原理

    动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译时就确定了,而动态代理的代理关 ...

  6. aop实现原理-动态代理CGLib代理

    那接下来的话,那咱们Spring当中,这个AOP,咱们先说概念,咱们先不写具体代码,咱们就是聊,聊Spring的AOP,Spring能帮我们干啥呢,我告诉你,Spring他作为对象的容器,Spring ...

  7. CGLib动态代理原理

    CGLib动态代理原理 CGLib动态代理是代理类去继承目标类,然后重写其中目标类的方法啊,这样也可以保证代理类拥有目标类的同名方法: 看一下CGLib的基本结构,下图所示,代理类去继承目标类,每次调 ...

  8. 【java】CGLIB动态代理原理分析

    1.概述 前一篇文章介绍了CGLIB中常用的API,实际上使用了Enhancer和MethodInterceptor之后会生成代理子类,这篇文章就是分析一下CGLIB动态代理的原理. 2.CGLIB动 ...

  9. 【java】CGLIB动态代理原理

    文章目录 1. 简介 2. 示例 3. 原理 4. JDK动态代理与CGLIB动态代理区别(面试常问) 1. 简介 CGLIB的全称是:Code Generation Library. CGLIB是一 ...

最新文章

  1. Cacti的库表结构-Data
  2. HTML+CSS+PHP+COOKIE在本地搭建一个简易的登陆注册网页
  3. string’ does not name a type 错误解析
  4. GSM BTS Hacking: 利用BladeRF和开源BTS 5搭建基站
  5. laravel如何生成swagger接口文档
  6. NOIP模拟测试28「阴阳·虎·山洞」
  7. C++学习之路,漫长而遥远
  8. MySQL关键字EXPLAIN的用法及其案例
  9. Linux日志服务器的搭建
  10. 库克警告员工不要泄露公司信息:将全力追查
  11. pycharm新建项目怎么选择框架_必看!心血管疾病怎么选择检查项目?
  12. 异常日志处理-ThrowsAdvice
  13. 微软发表IE浏览器 F1漏洞安全公告
  14. 为了躲开违规电动车,我一下子撞电线杆上了
  15. C++ 常见编译错误解决办法
  16. IBM P系列小型机HMC默认IP地址
  17. aut0cad2010卸载工具_win10系统cad卸载不干净怎么办?win10怎么把cad卸载干净
  18. 【线代】相似矩阵中特征根的求法:特征方程、一般方程为什么求得的特征根含义不同?
  19. 基于深度强化学习的完全AI自动的俄罗斯方块游戏
  20. C#(unity/新手向)游戏暂停按钮(实现点击切换按钮文字:暂停/继续)

热门文章

  1. 项目实训----Unity多人游戏开发----第四篇
  2. 【机器学习】多项式回归的思想以及在sklearn中使用多项式回归(含示例+代码)
  3. 【华为OD机试真题】AI处理器组合(java)100%通过率 超详细代码注释 代码深度解读
  4. cxfreeze打包python2.7为exe可执行程序
  5. 信息系统项目管理师(2022年) —— 专业英语篇
  6. 本实战将实现根据输入的父亲和母亲的身高,预测出儿子的身高,并打印出来。计算公式为:儿子身高 = (父亲身高+ 母亲身高)×0.54。实现效果如图3所示。
  7. 企业单位公众号如何上传附件(如Word,Excel,PPT等)
  8. 计算机毕业设计node.js+Vue+Element驾校信息管理系统
  9. Python 图像处理实用指南:1~5
  10. Oracle ERP Application Diagnostics使用