JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。

举例:

1、定义被代理类:

public class CglibOrigin {
​public  CglibOrigin(){System.out.println("CglibOrigin对象创建");}public final void  finalMethod(){System.out.println("final方法执行");}
​public void  regularMethod(){System.out.println("regularMethod方法执行");}
}

2、定义拦截器,用以拦截被代理对象的方法(需要实现MenthodInterceptor接口)

public class MyMethodInterceptor implements MethodInterceptor {
​//Object o——生成的代理对象//Method——被代理对象的方法//Object[] objects——方法的参数//methodProxy——代理方法@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("======插入前置通知======");((CglibOrigin)o).regularMethod();Object object = methodProxy.invokeSuper(o, objects);System.out.println("======插入后者通知======");return object;}
}

其中intercept()就是代理对象调用到方法时执行到的代码,即实现增强的代码部分;

而methodProxy.invokeSuper(o, objects)是执行被代理对象的方法;

3、测试

public class MyTest {
​@Testpublic void test(){Enhancer enhancer = new Enhancer();//设置被代理类classenhancer.setSuperclass(CglibOrigin.class);//设置回调对象即拦截器enhancer.setCallback(new MyMethodInterceptor());//生成代理对象CglibOrigin origin = (CglibOrigin)enhancer.create();//调用方法origin.regularMethod();}
}

这里的origin.regularMethod()方法,其实就是执行MyMethodInterceptor的intercept()。

生成的代理对象内部是这样的:

public final void sayHello() {//enhancer中赋值给callback的拦截器对象MethodInterceptor var10000 = this.CGLIB$CALLBACK_0; ​ if (var10000 == null) { ​ CGLIB$BIND_CALLBACKS(this); ​ var10000 = this.CGLIB$CALLBACK_0; ​ }if (var10000 != null) {//调用拦截器MethodInterceptor的interceptor方法,完成增强var10000.intercept(this, CGLIB$sayHello$0$Method, CGLIB$emptyArgs, CGLIB$sayHello$0$Proxy);} else {super.sayHello();}
}

需要特别注意的是,CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少,但是CGLib在创建代理对象时所花费的时间却比JDK多得多,所以对于单例的对象,因为无需频繁创建对象,用CGLib合适,反之,使用JDK方式要更为合适一些。同时,由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理。

(普通方法可以增强)

(final修饰的方法不可以增强)

jdk和cglib动态代理原理上的区别:

java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。

而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

cglib动态代理实现及其原理浅析相关推荐

  1. Cglib动态代理实现及原理

    JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要Cglib了.Cglib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采 ...

  2. SpringAOP的CGLIB动态代理的底层原理实现

    欢迎加入java学习讨论群:725562382 CGLIB动态代理: CGLIB(Code Generation Library)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,它可以 ...

  3. 【动态代理】CGLIB 动态代理的使用及原理

    1. CGLIB 动态代理介绍 什么是 CGLIB? CGLIB是一个功能强大,高性能的代码生成包.它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充. 通常可以使用Java的动态代理创 ...

  4. 谁与争锋,JDK动态代理大战CGLib动态代理

    文章目录 一.前言 二.基本概念 三.JDK 和 CGLib动态代理区别 3.1 JDK动态代理具体实现原理 3.2 CGLib动态代理 3.3 两者对比 3.4 使用注意 四.JDK 和 CGLib ...

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

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

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

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

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

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

  8. CGLib动态代理原理及实现

    原文连接:http://songbo-mail-126-com.iteye.com/blog/968792 ---------------------------------------------- ...

  9. CGLib动态代理原理

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

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

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

最新文章

  1. 通过NSProxy来解决NSTimer使用不当造成内存泄漏的问题
  2. top 命令显示隐藏参数列
  3. MySQL 多实例给root用户创建密码
  4. mysql主主keepalived_MySQL主主+Keepalived实现高可用
  5. 【JavaWeb】已解决:Resource interpreted as Stylesheet but transferred with MIME type text/html
  6. 台湾印象之三:吃与喝
  7. 苹果天气不显示_热门天气APP被苹果拿下,安卓用户不能再使用
  8. 常用Linux运维命令
  9. CentOS 安装gnutls
  10. connection url mysql,JDBC 连接MySQL实例详解
  11. CDN的安全防护功能
  12. 直播围观!百度大脑智能监控如何为安全生产保驾护航?
  13. python资源网站_Python 博客网站资源
  14. 数学建模—多元回归分析
  15. matlab多久可以入门,5分钟入门matlab
  16. Metro 风格页面设计
  17. 固态硬盘和机械硬盘的区别是什么
  18. 定制属于你的专属上网导航页,个性域名、个性皮肤,你说了算!
  19. 什么是i人,mbti中的i型人格是怎么样的
  20. 大学计算机专业哪个学校最好,计算机专业:最好的7所大学!也是全中国“最难考”的大学!...

热门文章

  1. 企业多园区统一灾备建设最佳实践
  2. pdf打印机安装程序_Adobe Acrobat DC安装以及PDF打印机安装教程
  3. 【更新】PDF控件Spire.PDF V3.9.463发布 | 修复多个PDF转换bug
  4. 推荐系统实践:基于数据集MovieLens构造简单推荐系统
  5. 驾考维语版本-维语驾考手机电脑版-民语驾考网
  6. NUC980 DIY项目大挑战 - EtherCAT实现
  7. 异贝,通过移动互联网技术,为中小微实体企业联盟、线上链接、线上线下自定义营销方案推送。案例32
  8. Proteus 8.9下载安装指南
  9. PHP肥料源码_PHP农场养殖游戏巨人农场复利平台源码带抽奖
  10. 算法导论PDF原文算法分享