文章目录

  • 前言
  • 一、静态代理的弊端
  • 二、动态代理的优势
  • 三、动态代理使用流程
    • 1、目标对象接口
    • 2、被代理对象
    • 3、调用处理程序
    • 4、客户端
  • 四、动态生成 代理对象 类 的 字节码 文件数据

前言

代理模式结构 : 代理模式中的元素有 客户端 , 主题对象 , 被代理对象 , 代理对象 ;

  • 客户端 持有 主题对象 , 调用其方法 ;
  • 代理对象 和 被代理对象 都是 主题 的子类 ;
  • 代理对象 持有 被代理对象 , 可以调用 被代理对象 的方法 ;

代理模式的核心 : 代理对象 与 被代理对象 都实现同一个父类或接口 , 这样在客户端使用时 , 客户端 感觉自己与 被代理对象 沟通 , 但用户实际上与 代理对象 进行沟通 ;

一、静态代理的弊端


静态代理 中 , 代理对象 和 被代理对象 必须实现 主题对象 接口 , 如果 主题对象 接口发生改变 , 则相应的 代理对象 和 被代理对象 都要进行相应修改 ;

二、动态代理的优势


动态代理 解决了 静态代理的上述问题 , 不需要手动创建代理对象 , 由 Java 虚拟机实现 代理对象 , 该代理对象自动实现 主题对象 的接口 ;

动态代理执行时 , 动态地创建了字节码文件 , 生成了代理类 ;

三、动态代理使用流程


动态代理使用流程 :

  • ① 创建目标对象 : 创建 目标对象 接口 ;

  • ② 创建被代理对象 : 创建 被代理对象 , 实现 目标对象 接口 ;

  • ③ 创建调用处理程序 : 创建 InvocationHandler 子类对象 , 内部持有 被代理对象 , 在 invoke 方法中 , 返回 method.invoke(subject, args) ;

  • ④ 动态创建代理对象 : 调用 Proxy.newProxyInstance 创建 代理对象 实例对象 , 由 JVM 自动创建代理对象类 , 然后再创建对应的实例对象 ;

  • ⑤ 动态代理调用 : 调用 代理对象 实例的相关 目标对象 接口 方法 ;

1、目标对象接口

/*** 目标接口*  代理对象 和 被代理对象 都要实现该接口*/
public interface Subject {void request();
}

2、被代理对象

/*** 被代理对象*/
public class RealSubject implements Subject {@Overridepublic void request() {System.out.println("被代理对象 RealSubject request()");}
}

3、调用处理程序

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;public class DynamicInvocationHandler implements InvocationHandler {/*** 持有的 被代理对象*/private Subject subject;public DynamicInvocationHandler(Subject subject) {this.subject = subject;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 调用真实的 被代理对象 的方法//  被代理对象的所有的方法的调用都会传到该方法中进行处理Object object = method.invoke(subject, args);return object;}
}

4、客户端

import java.lang.reflect.Proxy;public class Client {public static void main(String[] args) {// 被代理对象Subject realSubject = new RealSubject();// 创建调用处理程序 , 内部持有被代理对象DynamicInvocationHandler dynamicInvocationHandler =new DynamicInvocationHandler(realSubject);// 生成动态代理类Subject subject = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(),realSubject.getClass().getInterfaces(),dynamicInvocationHandler);// 动态代理调用subject.request();}
}

执行结果 :

四、动态生成 代理对象 类 的 字节码 文件数据


动态代理 中的 代理对象对应的 字节码类 是由 Java 虚拟机自动生成的 , 在 java.lang.reflect.Proxy 中 , 调用 ProxyGenerator.generateProxyClass 方法 , 生成了 代理对象 类 , 返回的 byte[] 数据就是字节码类对应的二进制数据 ;

            /** Generate the specified proxy class.*/byte[] proxyClassFile = ProxyGenerator.generateProxyClass(proxyName, interfaces, accessFlags);

ProxyGenerator 的源码需要下载 JDK 源码查看 , 在 IntelliJ IDEA 开发环境中无法查看 ;

网上找到了一篇博客 , 对此描述的很清楚 JDK动态代理[4]----ProxyGenerator生成代理类的字节码文件解析 ;

ProxyGenerator 中的 generateProxyClass 方法中 , 主要调用了 generateClassFile 方法 , 按照 Class 字节码的规范 , 按照顺序依次写入 魔数 , 次版本号 , 主版本号 , 常量池 , 访问修饰符 , 类索引 等数据 ;

【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )相关推荐

  1. 【设计模式】--- 装饰器模式、静态代理模式和动态代理模式

    文章目录 1 引子 2 业务场景介绍 3 静态代理模式 4 装饰器模式 5 动态代理模式 5.1 Proxy --- 具体的代理对象生成组件 5.2 InvocationHandler --- 封装被 ...

  2. 研磨23种大话设计模式------动态代理模式 + 小结静态代理模式

    大家好,我是一位在java学习圈中不愿意透露姓名并苟且偷生的小学员,如果文章有错误之处,还望海涵,欢迎多多指正 如果你从本文 get 到有用的干货知识,请帮忙点个赞呗,据说点赞的都拿到了offer 在 ...

  3. 设计模式(十三) 代理模式和Java动态代理

    Proxy Pattern 1. 什么是代理模式 代理模式: 给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问. Proxy Pattern: Provide a surrogate ...

  4. 设计模式—代理模式以及动态代理的实现

    代理模式(Proxy Design Pattern)是为一个对象提供一个替身,以控制对这个对象的访问.即通过代理对象访问目标对象.被代理的对象可以是远程对象.创建开销大的对象或需要安全控制的对象. 一 ...

  5. Java设计模式(代理模式-模板方法模式-命令模式)

    Java设计模式Ⅴ 1.代理模式 1.1 代理模式概述 1.2 静态代理 1.2.1 静态代理概述 1.2.2 代码理解 1.3 动态代理之JDK代理 1.3.1 动态代理之JDK代理概述 1.3.2 ...

  6. 北风设计模式课程---深入理解[代理模式]原理与技术

    北风设计模式课程---深入理解[代理模式]原理与技术 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 设计模式都是对生活的抽象,比如用户获得装备,我可以先装 ...

  7. cglib动态代理jar包_代理模式详解:静态代理+JDK/CGLIB 动态代理实战

    1. 代理模式 代理模式是一种比较好的理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标 ...

  8. 设计模式笔记15:代理模式(Proxy Pattern)

    一.代理模式的内容        代理模式为另一个对象提供一个替身或占位符以访问这个对象.         给某一个对象提供一个代理,并由代理对象控制对原对象的引用.代理模式的英文叫做Proxy或Su ...

  9. Java拾遗:007 - 代理模式与动态代理

    2019独角兽企业重金招聘Python工程师标准>>> 代理模式 在日常开发中我们可以会接手一些老的项目,有时连源码都没有,或者有时候我会需要对业务逻辑做一定增强(功能扩展,如:日志 ...

  10. 二十三种设计模式(第十二种)-----代理模式(Proxy)

    二十三种设计模式(第十二种)-----代理模式(Proxy) 尚硅谷视频连接https://www.bilibili.com/video/BV1G4411c7N4?from=search&se ...

最新文章

  1. Python之glob模块进行文件匹配及遍历
  2. php 算法 数字比较,数据两两比较的高效算法?
  3. 如何在php搜索显示数据库数据结构_PHP如何实现抓取百度搜索结果并分析数据结构...
  4. wxWidgets:wxFileName类用法
  5. nlm算法matlab代码_遗传算法GA的MATLAB代码
  6. 程序员必知的 Python 陷阱与缺陷列表
  7. 查找任意数目参数的最大值
  8. html 常用button事件
  9. rk399_android7.1的mipi驱动代码追踪(部分)
  10. 数据库修改服务器,服务器数据库修改
  11. MATLAB--基本绘图函数
  12. 好用的BUS调试工具-Bus Hound
  13. swfobject参数详解
  14. 软件测试正交矩阵,正交矩阵在测试用例设计中的应用
  15. linux下oracle数据库自动备份方案
  16. 使用SQLite Developer可视化解析sqlite数据库文件
  17. 汇编语言--微机CPU的指令系统(五)(循环指令)
  18. 电脑增加机械硬盘计算机管理,电脑加装机械硬盘直接插上就行了么
  19. [IOS初学]ios 第一篇 storyboard 与viewcontroller的关系 - Zoe_J
  20. 二十分(java更新至2021年)

热门文章

  1. crab-源码-模型和算法
  2. ShopEx安装过程
  3. C#函数实现的小功能
  4. Redis与Memcache的对比
  5. Socket.IO 客户端 API IO
  6. 06python 之基本数据类型
  7. 陈鑫136201010502
  8. 【作业四】软件案例分析之必应词典
  9. jaquery ready
  10. 看视频笔记1【wpf】