【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )
文章目录
- 前言
- 一、静态代理的弊端
- 二、动态代理的优势
- 三、动态代理使用流程
- 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 引子 2 业务场景介绍 3 静态代理模式 4 装饰器模式 5 动态代理模式 5.1 Proxy --- 具体的代理对象生成组件 5.2 InvocationHandler --- 封装被 ...
- 研磨23种大话设计模式------动态代理模式 + 小结静态代理模式
大家好,我是一位在java学习圈中不愿意透露姓名并苟且偷生的小学员,如果文章有错误之处,还望海涵,欢迎多多指正 如果你从本文 get 到有用的干货知识,请帮忙点个赞呗,据说点赞的都拿到了offer 在 ...
- 设计模式(十三) 代理模式和Java动态代理
Proxy Pattern 1. 什么是代理模式 代理模式: 给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问. Proxy Pattern: Provide a surrogate ...
- 设计模式—代理模式以及动态代理的实现
代理模式(Proxy Design Pattern)是为一个对象提供一个替身,以控制对这个对象的访问.即通过代理对象访问目标对象.被代理的对象可以是远程对象.创建开销大的对象或需要安全控制的对象. 一 ...
- Java设计模式(代理模式-模板方法模式-命令模式)
Java设计模式Ⅴ 1.代理模式 1.1 代理模式概述 1.2 静态代理 1.2.1 静态代理概述 1.2.2 代码理解 1.3 动态代理之JDK代理 1.3.1 动态代理之JDK代理概述 1.3.2 ...
- 北风设计模式课程---深入理解[代理模式]原理与技术
北风设计模式课程---深入理解[代理模式]原理与技术 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 设计模式都是对生活的抽象,比如用户获得装备,我可以先装 ...
- cglib动态代理jar包_代理模式详解:静态代理+JDK/CGLIB 动态代理实战
1. 代理模式 代理模式是一种比较好的理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标 ...
- 设计模式笔记15:代理模式(Proxy Pattern)
一.代理模式的内容 代理模式为另一个对象提供一个替身或占位符以访问这个对象. 给某一个对象提供一个代理,并由代理对象控制对原对象的引用.代理模式的英文叫做Proxy或Su ...
- Java拾遗:007 - 代理模式与动态代理
2019独角兽企业重金招聘Python工程师标准>>> 代理模式 在日常开发中我们可以会接手一些老的项目,有时连源码都没有,或者有时候我会需要对业务逻辑做一定增强(功能扩展,如:日志 ...
- 二十三种设计模式(第十二种)-----代理模式(Proxy)
二十三种设计模式(第十二种)-----代理模式(Proxy) 尚硅谷视频连接https://www.bilibili.com/video/BV1G4411c7N4?from=search&se ...
最新文章
- Python之glob模块进行文件匹配及遍历
- php 算法 数字比较,数据两两比较的高效算法?
- 如何在php搜索显示数据库数据结构_PHP如何实现抓取百度搜索结果并分析数据结构...
- wxWidgets:wxFileName类用法
- nlm算法matlab代码_遗传算法GA的MATLAB代码
- 程序员必知的 Python 陷阱与缺陷列表
- 查找任意数目参数的最大值
- html 常用button事件
- rk399_android7.1的mipi驱动代码追踪(部分)
- 数据库修改服务器,服务器数据库修改
- MATLAB--基本绘图函数
- 好用的BUS调试工具-Bus Hound
- swfobject参数详解
- 软件测试正交矩阵,正交矩阵在测试用例设计中的应用
- linux下oracle数据库自动备份方案
- 使用SQLite Developer可视化解析sqlite数据库文件
- 汇编语言--微机CPU的指令系统(五)(循环指令)
- 电脑增加机械硬盘计算机管理,电脑加装机械硬盘直接插上就行了么
- [IOS初学]ios 第一篇 storyboard 与viewcontroller的关系 - Zoe_J
- 二十分(java更新至2021年)