CGLib动态代理原理及实现

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

------------------------------------------------------------------------

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

   简单的实现举例:

这是一个需要被代理的类,也就是父类,通过字节码技术创建这个类的子类,实现动态代理。

[java] view plain copy
  1. public class SayHello {  
  2.  public void say(){  
  3.   System.out.println("hello everyone");  
  4.  }  
  5. }  
该类实现了创建子类的方法与代理的方法。getProxy(SuperClass.class)方法通过入参即父类的字节码,通过扩展父类的class来创建代理对象。intercept()方法拦截所有目标类方法的调用,obj表示目标类的实例,method为目标类方法的反射对象,args为方法的动态入参,proxy为代理类实例。proxy.invokeSuper(obj, args)通过代理类调用父类中的方法。

[java] view plain copy
  1. public class CglibProxy implements MethodInterceptor{  
  2.  private Enhancer enhancer = new Enhancer();  
  3.  public Object getProxy(Class clazz){  
  4.   //设置需要创建子类的类  
  5.   enhancer.setSuperclass(clazz);  
  6.   enhancer.setCallback(this);  
  7.   //通过字节码技术动态创建子类实例  
  8.   return enhancer.create();  
  9.  }  
  10.  //实现MethodInterceptor接口方法  
  11.  public Object intercept(Object obj, Method method, Object[] args,  
  12.    MethodProxy proxy) throws Throwable {  
  13.   System.out.println("前置代理");  
  14.   //通过代理类调用父类中的方法  
  15.   Object result = proxy.invokeSuper(obj, args);  
  16.   System.out.println("后置代理");  
  17.   return result;  
  18.  }  
  19. }  

具体实现类:

[java] view plain copy
  1. public class DoCGLib {  
  2.  public static void main(String[] args) {  
  3.   CglibProxy proxy = new CglibProxy();  
  4.   //通过生成子类的方式创建代理类  
  5.   SayHello proxyImp = (SayHello)proxy.getProxy(SayHello.class);  
  6.   proxyImp.say();  
  7.  }  
  8. }  

输出结果:

[plain] view plain copy
  1. 前置代理  
  2. hello everyone  
  3. 后置代理  
     CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少,但是CGLib在创建代理对象时所花费的时间却比JDK多得多,所以对于单例的对象,因为无需频繁创建对象,用CGLib合适,反之,使用JDK方式要更为合适一些。同时,由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微型计算机的硬件组成中ssd硬盘通常是指,2015年计算机一级msoffice选择题121道及答案...

31、通常,在微机中标明的P4或奔腾4是指( D )A、产品型号B、主频C、微机名称D、微处理器型号32、以平均无故障时间(MTBF),用于描述计算机的( A )A、可靠性B、可维护性C、性能价格比D、以上答案都不对33、以平均修复时间(MTTR),用于描述计算机的…

双曲函数奇偶性_基本初等函数之奇偶性(强基系列42)

基本初等函数之奇偶性(强基系列4-2)开卷有益初等函数是由幂函数(power function)、指数函数(exponential function)、对数函数(logarithmic function)、三角函数(trigonometric function)、反三角函数(inverse trigonometric function)与常数经过有限次的有理运算(加、减、乘、…

Caused by: Parent package is not defined: json-default - [unknown location]

原文连接:http://blog.csdn.net/bebested/article/details/52627890 ------------------------------------------------------------------------------------------- Unable to load configuration. - [unknown location] at com.opensymphony.xwork2.config.Co…

【window】git安装教程

相关链接:https://blog.csdn.net/nly19900820/article/details/73379854 作者:smile.轉角 QQ:493177502转载于:https://www.cnblogs.com/websmile/p/9384060.html

html文件打开系统错误,win7打开word提示“无法打开文件Normal因为内容有错误”的两种解决方法...

win7系统打开Word的时候,弹出提示“无法打开文件Normal.dotm,因为内容有错误”,为什么会出现错误提示呢?小编就按照错误提示寻找文件,最后发现是Word自动生成的模板Normal出错了,知道故障原因后,接下去教程…

超链接跳转到action使用哪个方法_管道疏通剂哪个牌子好 管道疏通机使用方法有哪些...

平时大家不用的水或者一些物品,在处理的时候应该都会倒到下水道之中,而下水道确实具备着这一种效果,但很多时候,下水道往往会因为口比较小,而被一些物品所堵塞,这样一来,影响上其实会非常大&…

linux学习-将seafile启动脚本设置为开机启动服务

有时候,我们安装的linux软件和程序不是通过yum安装,而是通过编译或者其他方式安装。有时需要将程序设置为服务,达到开机启动的目的。我在公有云的与服务器上搭建了seafile网盘,当我重启云服务器的时候,seafile的程序不…

物理借助传感器用计算机测速度,用打点计时器测速度教案_物理_教学设计_人教版...

第四节、实验:用打点计时器测速度西安中学:张卫岗邮编:710021【教材版本】人民教育出版社【设计理念】实验是物理学习的基础,通过自主探究、问题研究,结合速度概念的科学认识,体验科学研究与生活实际的联系…

Failed to load or instantiate TagLibraryValidator class: org.apache.taglibs.standard.tlv.JstlFmtTLV

原因: 1、缺包。如缺 standard-1.1.2.jar servlet-api-2.4.jar jstl-1.1.2.jar 2、包重复。最可能是 servlet-api-2.4.jar jsp-api-2.0.jar 与Tomcat lib 下的冲突。删掉 web-inf/lib下的

中文整合包_案例 | 美研市场营销和整合营销专业1620Fall 580+申请实例(含MS+PHD)...

关注“留学壹周刊”,回复专业名称,如“金融”,可以自由查询相关资料介绍本篇微信主要包括如下内容:580美研市场营销和整合营销专业16-20Fall申请实例,包括6个文件:1、MS项目申请实例2、PHD项目申请实例3、成…

关于HttpClient上传中文乱码的解决办法

使用过HttpClient的人都知道可以通过addTextBody方法来添加要上传的文本信息,但是,如果要上传中文的话,或还有中文名称的文件会出现乱码的问题,解决办法其实很简单: 第一步:设置MultipartEntityBuilder的编…

写在开头

今年项目组任务超量完成,到过年都可以轻松了。 今年开发了一个基于dubbo的分布式系统,高并发,大数据,数据分析建模。目前热门的都用上了。 近期决定把我2013年时一个单体应用架构的项目改造成基于dubbo的分布式系统。 该项目是…

学计算机的让修电脑搞笑段子精选,搞笑段子:阿姨,我是真的就来给他们修电脑的!...

搞笑段子:阿姨,我是真的就来给他们修电脑的修电脑在上大学的时间,经常用修电脑的名号进入到女生宿舍之中,当时的宿管阿姨人特别好,稍微的问一下就让我进去了。有一天,我刚要进去的时间,她拉着我…

react table里跳转页面_react路由配置基础篇:react-router4.0及以上

随着react路由组件的不断升级,react-router4以下的版本和4以上的版本配置还是有一定的区别,这里就不累赘陈述了,笔者分享下使用react-router4.0以上版本的经验。1、安装react-router-domnpm install react-router-dom --save2、基本配置&…

Caused by: java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.LoopTag

明明引入了 jstl&#xff0c;为什么还报错&#xff1f; 原来引入的不对。 错误的引入&#xff1a; <dependency><groupId>javax.servlet.jsp.jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency&…

jade的写法

标签直接写&#xff1a;p或p. 例如&#xff1a; p 今天自己很棒p.今天自己很棒则输入 <p>今天自己很棒</p><p>今天自己很棒</p>***jage模板记得需要书写规范&#xff0c;需要空两个空格。 jage变量调用 jade 的变量调用有 3 种方式 # {表达式} 表达式!…

计算机论文答辩2分钟演讲稿,毕业答辩发言稿三分钟

论文答辩是一种比较正规的审查形式&#xff0c;有组织、有准备、有鉴定、有计划的。答辩会由校方、答辩委员会还有答辩者组成。小编在此献上毕业答辩开场白&#xff0c;希望大家喜欢。毕业答辩发言稿三分钟1:各位老师&#xff0c;上午好!我叫赵晓琦&#xff0c;是土木工程0801班…

Zookeeper单机安装

1、 修改操作系统的/etc/hosts 文件中添加&#xff1a; 2、 下载zookeeper 3、 解压zookeeper 安装包&#xff1a; $ tar -zxvf zookeeper-3.4.6.tar.gz 4、 在/home/zengmg/zookeeper-3.4.6 目录下…

cad怎么向下位移_CAD制图初学入门教程:阵列功能的使用技巧

阵列在浩辰CAD软件中也是比较常用的功能之一&#xff0c;但是有些CAD制图初学入门者对此并不是很了解。那么在浩辰CAD软件中阵列功能怎么用呢&#xff1f;接下来就给大家分享一些关于阵列功能的CAD制图初学入门技巧吧&#xff01;首先在浩辰CAD软件中打开CAD图纸&#xff0c;然…

设置zookeeper开机自启动

原文连接&#xff1a;http://blog.csdn.net/u012453843/article/details/70162796 -------------------------------------------------------两种方式可以实现开机自启动 第一种&#xff1a;直接修改/etc/rc.d/rc.local文件 在/etc/rc.d/rc.local文件中需要输入两行&#xff0…