cglib动态代理实现及其原理浅析
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动态代理实现及其原理浅析相关推荐
- Cglib动态代理实现及原理
JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要Cglib了.Cglib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采 ...
- SpringAOP的CGLIB动态代理的底层原理实现
欢迎加入java学习讨论群:725562382 CGLIB动态代理: CGLIB(Code Generation Library)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,它可以 ...
- 【动态代理】CGLIB 动态代理的使用及原理
1. CGLIB 动态代理介绍 什么是 CGLIB? CGLIB是一个功能强大,高性能的代码生成包.它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充. 通常可以使用Java的动态代理创 ...
- 谁与争锋,JDK动态代理大战CGLib动态代理
文章目录 一.前言 二.基本概念 三.JDK 和 CGLib动态代理区别 3.1 JDK动态代理具体实现原理 3.2 CGLib动态代理 3.3 两者对比 3.4 使用注意 四.JDK 和 CGLib ...
- 深入理解Java Proxy和CGLIB动态代理原理
点击上方关注,每天进步一点点 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译 ...
- jdk动态代理实例和cglib动态代理实例_CGLib 动态代理 原理解析
JDK 动态代理实现与原理 首先来看一段CGLib代理的测试代码(MethodInterceptor的测试, 其他类型这里不做展开了). Util类的代码在后面给出的码云片段中 public 下面的输 ...
- Java Proxy和CGLIB动态代理原理
动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译时就确定了,而动态代理的代理关 ...
- CGLib动态代理原理及实现
原文连接:http://songbo-mail-126-com.iteye.com/blog/968792 ---------------------------------------------- ...
- CGLib动态代理原理
CGLib动态代理原理 CGLib动态代理是代理类去继承目标类,然后重写其中目标类的方法啊,这样也可以保证代理类拥有目标类的同名方法: 看一下CGLib的基本结构,下图所示,代理类去继承目标类,每次调 ...
- 【java】CGLIB动态代理原理分析
1.概述 前一篇文章介绍了CGLIB中常用的API,实际上使用了Enhancer和MethodInterceptor之后会生成代理子类,这篇文章就是分析一下CGLIB动态代理的原理. 2.CGLIB动 ...
最新文章
- 通过NSProxy来解决NSTimer使用不当造成内存泄漏的问题
- top 命令显示隐藏参数列
- MySQL 多实例给root用户创建密码
- mysql主主keepalived_MySQL主主+Keepalived实现高可用
- 【JavaWeb】已解决:Resource interpreted as Stylesheet but transferred with MIME type text/html
- 台湾印象之三:吃与喝
- 苹果天气不显示_热门天气APP被苹果拿下,安卓用户不能再使用
- 常用Linux运维命令
- CentOS 安装gnutls
- connection url mysql,JDBC 连接MySQL实例详解
- CDN的安全防护功能
- 直播围观!百度大脑智能监控如何为安全生产保驾护航?
- python资源网站_Python 博客网站资源
- 数学建模—多元回归分析
- matlab多久可以入门,5分钟入门matlab
- Metro 风格页面设计
- 固态硬盘和机械硬盘的区别是什么
- 定制属于你的专属上网导航页,个性域名、个性皮肤,你说了算!
- 什么是i人,mbti中的i型人格是怎么样的
- 大学计算机专业哪个学校最好,计算机专业:最好的7所大学!也是全中国“最难考”的大学!...
热门文章
- 企业多园区统一灾备建设最佳实践
- pdf打印机安装程序_Adobe Acrobat DC安装以及PDF打印机安装教程
- 【更新】PDF控件Spire.PDF V3.9.463发布 | 修复多个PDF转换bug
- 推荐系统实践:基于数据集MovieLens构造简单推荐系统
- 驾考维语版本-维语驾考手机电脑版-民语驾考网
- NUC980 DIY项目大挑战 - EtherCAT实现
- 异贝,通过移动互联网技术,为中小微实体企业联盟、线上链接、线上线下自定义营销方案推送。案例32
- Proteus 8.9下载安装指南
- PHP肥料源码_PHP农场养殖游戏巨人农场复利平台源码带抽奖
- 算法导论PDF原文算法分享