代理模式的概念和静态代理之前的文章已经说过了,没看过的可以点这里。

动态代理意义在于生成一个占位(又称为代理对象),用来代理真实的对象,来控制真实对象的访问。

举个例子,现在有一家软件公司,公司里面有软件工程师和商务,这个时候客户带着需求来到公司,会直接去找商务谈,客户认为商务就代表着公司,关系如下

代理模式示意图

通过图可以看出来客户是通过商务去找软件工程师,商务的意义在哪里?商务可以进行谈判,根据客户的需求来谈判软件的价格,交付和时间点,如果谈判失败就直接结束了不会去找软件工程师。如果谈判成功再让软件工程师执行后续的操作。通过这个例子可以看出来,代理模式就是在访问真实的对象之前和之后做一些操作,比如在执行登录方法前后输出日志等等,还有可能是根据其它的规则来判断是否需要执行这个真实的对象去执行一些别的操作,比如mybatis的数据库操作(如果这篇文章有人看的话,后面会详细介绍)。

经过上面的例子,我们可以得出商务和软件工程师就是代理和被代理的关系。此时客户就是调用者,商务是代理对象而软件工程师就是真实对象。需要在调用者和真实对象中间加一个代理对象,代理对象需要和真实对象建立关系,所以建立代理对象需要几个步骤,

1、代理对象和真实对象建立代理关系

2、实现代理对象的代理逻辑

Java中有很多代理对象的技术,这里就讨论JDK和CGLIB的动态代理。

首先说一下JDK的动态代理,JDK的动态代理是java.lang.reflect.*包提供的方式,它必须要借助接口才可以实现(这里需要注意,如果只有实现类是无法完成代理的),首先我们先随便定义一个接口,如下图

接着提供实现类

按照上面的步骤来第一步建立代理对象和真实对象之间的关系,然后再实现代理逻辑。

在JDK动态代理中,要实现代理逻辑类就必须实现java.lang.reflect.InvocationHandler接口,实现里面的invoke方法。代码如下

第一步,建立代理对象和真实对象之间的关系。这里使用的是bind的方法,首先用成员变量来保存存入的真实对象,接着通过如下代码建立并生成代理对象

1、第一个参数是类加载器,我们使用的是真实对象的类加载器

2、第二个就是我们把生成的代理对象挂在那个接口之下,这样写就是放在真实对象的接口之下就是HelloWorld,如果真实对象没有实现接口这里会报错

3、第三个就是实现方法逻辑的代理类,就是是用哪一个类去代理的,this代表的是当前对象,它必须实现InvocationHandler接口的invoke方法,它是代理逻辑的实现方法。

第二步,实现代理逻辑方法,invoke方法可以实现代理逻辑,来解释下invoke方法的三个参数

1、proxy就是代理对象,就是bind方法中返回的对象(这里可以调试看看,和bind方法返回的对象是hash值是一样的),这个方法基本很少用,想了解的话,可以看看这个大佬的文章

2、method是当前调度的方法也可以说是真实对象的方法

3、args就是调度方法的参数

当我们使用代理对象的调度方法的时候就会执行invoke方法

这行代码就是执行真实对象的方法,只不过是利用反射来实现的

和前面的例子进行对比,proxy就是商务对象,target是软件工程是,bind的方法就是建立这两者之间的关系,invoke就是商务逻辑,控制软件工程师的访问。

打印结果如下

在执行invoke方法的前后都可以去添加需要添加的方法,建议可以自己调试一下看看,看看执行步骤是怎么样的。

接下来说一下CGLIB动态代理

JDK动态代理必须提供接口才可以进行使用,有时候不能提供接口的时候,只能来使用第三方的技术,比如CGLIB动态代理。它的优势在于不需要提供接口,只要一个非抽象类就能实现动态代理。

首先看一下代码

这里使用的是CGLIB的加强者Enhancer,然后设置了超类的方法(setSuperclass),这里可以和JDK的获得真实对象的接口类比,其实就是设置将真实对象转换为什么类型的,之后和JDK代理一样设置代理类是什么(setCallback)。其中的this代表当前对象,要求这个对象实现了MethodInterceptor类的intercept方法,然后再生产代理对象返回。

在这个类里面的intercept就是代理逻辑的方法,参数说明注释中已经说明。和JDK实现的代理没有什么区别,需要注意的是intercept方法里面,和JDK代理相比多了一个methodProxy参数,这个参数是方法代理,通过代理对象来实现真实对象的方法和之前略有不同。那这里为什么会有method这个参数呢,我的理解是CGLIB也可以代理接口,这个时候就可以用到它了,和之前的JDK相同一致。

总结一下,JDK代理和CGLIB代理是很相似的,都是先生成代理对象,制定代理的逻辑类。而代理逻辑类要实现接口的一个方法,那么定义的方法就是代理对象的逻辑方法,可以控制真实对象的方法。区别是JDK代理只可以代理接口,而CGLIB既可以代理接口又可以代理非抽象类。

JDK动态代理和CGLIB动态代理的异同相关推荐

  1. 什么是代理模式?代理模式有什么用?通过一个小程序分析静态代理和动态代理。自己简单实现动态代理。JDK动态代理和CGLIB动态代理的区别。

    1. 代理模式有什么用 ①功能增强,在实现目标功能的基础上,又增加了额外功能.就像生活中的中介一样,他跟两边客户会有私下的交流. ②控制访问,代理不让用户直接和目标接触.就像中间商一样,他们不会让我们 ...

  2. Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理

    Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理 代理模式 JDK动态代理 CGLIB动态代理 代理模式 代理模式是23种设计模式的一种,指一个对象A通过持有另一个对象B,可以具有B ...

  3. 利用代码分别实现jdk动态代理和cglib动态代理_面试之动态代理

    大家好!我是CSRobot,从今天开始,我将会发布一些技术文章,内容就是结合春招以来的面试所遇到的问题进行分享,首先会对知识点进行一个探讨和整理,在最后会给出一些面试题并作出解答,希望可以帮助到大家! ...

  4. JDK动态代理和CGLib动态代理简单演示

    JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期间创建接口的代理实例. 一.首先我们进行JDK动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: package te ...

  5. JAVA 进阶篇 动态代理 JDK动态代理和CGlib动态代理

    JDK动态代理和CGlib动态代理 JDK动态代理: 利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. CGlib动态代理: 利用ASM(开源的Java ...

  6. jdk动态代理和cglib动态代理实现及区别

    代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能. 代理模式又分为:静态代理.jdk动态代 ...

  7. Java两种动态代理JDK动态代理和CGLIB动态代理

    目录 代理模式 JDK动态代理 cglib动态代理 测试 代理模式 代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式.为了对外开放协议,B往往实现了一个 ...

  8. Spring AOP之---基于JDK动态代理和CGLib动态代理的AOP实现

    AOP(面向切面编程)是OOP的有益补充,它只适合那些具有横切逻辑的应用场合,如性能监测,访问控制,事物管理,日志记录等.至于怎么理解横切逻辑,敲完实例代码也就明白了. 为什么要使用AOP,举个栗子: ...

  9. Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别

    视频功能审核通过了,可以看视频啦!记得点关注啊~ 注意:因为网络原因,视频前一两分钟可能会比较模糊,过一会儿就好了 记得点关注啊,视频里的wx二维码失效了,wx搜索:"聊5毛钱的java&q ...

  10. 【Spring6】| GoF之代理模式(JDK动态代理和CGLIB动态代理)

    目录 一:GoF之代理模式 1. 对代理模式的理解 2. 静态代理 3. 动态代理 3.1 JDK动态代理 3.2 CGLIB动态代理 一:GoF之代理模式 1. 对代理模式的理解 生活场景1:牛村的 ...

最新文章

  1. Ubuntu 13.04 安装 OpenCV 及试用
  2. IBM发布未来五年五大科技预测
  3. python封装方法有几种_Python中的封装有什么作用?
  4. jersey球衣是什么_球衣知识------关于NIKE球衣(Jersey)的介绍
  5. SilkierQuartz 1.0.21 发布, 是一个 Quartz.NET 的强大且简单的Web管理工具和承载组件...
  6. 漫画:如何给女朋友解释什么是编译与反编译
  7. socket是什么?
  8. Leetcode 323.无向连通图中的连通分量个数
  9. 12个Flex常用功能代码
  10. Corporate Action Guidelines Terms
  11. Julia: [1 +j] ==[1 + j] ?
  12. Asp.Net构架(Http请求处理流程)
  13. VS快捷键及调试方法(含VAssistX快捷键)
  14. bp神经网络的应用案例,bp神经网络数学模型
  15. 最新二开版本的源码博客论坛源码,UI很漂亮。
  16. 广东省计算机设计大赛文档,广东省大学生计算机设计大赛.doc
  17. html图形渐变颜色一半一半,CSS3教程:background-image之放射性渐变(radial-gradient)详解...
  18. redis set设置有效时间问题
  19. project2016调配资源冲突
  20. 联想微型计算机设置从u盘启动,联想笔记本设置u盘为第一启动项教程

热门文章

  1. 数据库中的数据类型对应Java数据类型
  2. 状态码(Status Codes)
  3. A Crash Course on the Depths of Win32 Structured Exception Handling
  4. uni-app看图项目开发中遇到的小问题/知识点(持续更新)
  5. is not in the sudoers file 解决方案
  6. 如何实现PLC远程监控,下载,调试等
  7. 新建简单小程序快速开发模板
  8. R语言 使用RODBC连接oracle数据库
  9. 3dmax2021 按空格键卡死 win10
  10. 赛事推荐| 建筑物实例分割和高度估计的多任务学习——2023 IEEE GRSS 数据融合赛道2