【设计模式】代理模式 ( 动态代理 | 模拟 Java 虚拟机生成对应的 代理对象 类 )
文章目录
- 前言
- 一、模拟 JVM 生成对应的 代理对象
- 二、模拟 JVM 生成对应的 代理对象 完整流程展示
- 1、目标对象接口
- 2、被代理对象
- 3、调用处理程序
- 4、模拟 JVM 生成的代理对象类
- 5、客户端
前言
动态代理使用流程 :
① 创建目标对象 : 创建 目标对象 接口 ;
② 创建被代理对象 : 创建 被代理对象 , 实现 目标对象 接口 ;
③ 创建调用处理程序 : 创建
InvocationHandler
子类对象 , 内部持有 被代理对象 , 在invoke
方法中 , 返回method.invoke(subject, args)
;④ 动态创建代理对象 : 调用
Proxy.newProxyInstance
创建 代理对象 实例对象 , 由 JVM 自动创建代理对象类 , 然后再创建对应的实例对象 ;⑤ 动态代理调用 : 调用 代理对象 实例的相关 目标对象 接口 方法 ;
本篇博客 基于 【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 ) 三、动态代理使用流程 中的示例 , 模拟写出一个由 Java 虚拟机自动生成的字节码类 ;
一、模拟 JVM 生成对应的 代理对象
下面的类基本 JVM 动态生成的类功能一致 ;
在该动态生成的类中 , 持有 被代理对象 和 调用处理程序 ;
在每个 目标对象 接口方法中 , 使用反射获取对应的方法 , 将
- 反射获取的
Method
对象实例 , - 持有的 被代理对象实例 ,
- 方法参数 ,
全部传入 调用处理程序 InvocationHandler 的 invoke
方法中 ;
这也是所有的 目标对象 方法 , 都能在 InvocationHandler
的 invoke
方法中回调到的原因 ;
生成的代码示例 :
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;/*** 代理对象* 模拟由 JVM 自动生成的动态代理类*/
public class DynamicProxy implements Subject {/*** 代理对象中持有被代理对象的引用* 构造方法注入*/private Subject subject;/*** 持有调用处理程序* 构造方法注入*/private InvocationHandler invocationHandler;public DynamicProxy(Subject subject, InvocationHandler invocationHandler) {this.subject = subject;this.invocationHandler = invocationHandler;}@Overridepublic void request() {try {Method method = subject.getClass().getMethod("request", null);invocationHandler.invoke(subject, method, null);} catch (NoSuchMethodException e) {e.printStackTrace();} catch (Throwable throwable) {throwable.printStackTrace();}}
}
二、模拟 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、模拟 JVM 生成的代理对象类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;/*** 代理对象* 模拟由 JVM 自动生成的动态代理类*/
public class DynamicProxy implements Subject {/*** 代理对象中持有被代理对象的引用* 构造方法注入*/private Subject subject;/*** 持有调用处理程序* 构造方法注入*/private InvocationHandler invocationHandler;public DynamicProxy(Subject subject, InvocationHandler invocationHandler) {this.subject = subject;this.invocationHandler = invocationHandler;}@Overridepublic void request() {try {Method method = subject.getClass().getMethod("request", null);invocationHandler.invoke(subject, method, null);} catch (NoSuchMethodException e) {e.printStackTrace();} catch (Throwable throwable) {throwable.printStackTrace();}}
}
5、客户端
import java.lang.reflect.Proxy;public class Client {public static void main(String[] args) {// 被代理对象Subject realSubject = new RealSubject();// 创建调用处理程序 , 内部持有被代理对象DynamicInvocationHandler dynamicInvocationHandler =new DynamicInvocationHandler(realSubject);// 创建动态代理类DynamicProxy proxy = new DynamicProxy(realSubject, dynamicInvocationHandler);// 动态代理调用proxy.request();}
}
执行结果 :
该展示相当于一个静态代理展示 ;
【设计模式】代理模式 ( 动态代理 | 模拟 Java 虚拟机生成对应的 代理对象 类 )相关推荐
- 红橙Darren视频笔记 代理模式 动态代理和静态代理
红橙Darren视频笔记 代理模式 动态代理和静态代理(Android API 25) 关于代理模式我之前有过相关的介绍: https://blog.csdn.net/u011109881/artic ...
- 小菜成长记---【proxy 代理模式 ---西门庆干潘金莲——王婆做代理】
西门庆找潘金莲,潘金莲肯定不会答应,咋办找个王婆做代理呗. 西门庆干潘金莲的事我就不说了大家心里明的像镜似的.. 程序代码实现如下: 定义女人接口,以及方法. 潘金莲实现女人接口,以及方法. 王婆实现 ...
- Java设计模式-之代理模式(动态代理)
一.简介 1.什么叫代理模式: 简而言之就是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起 ...
- 【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )
文章目录 前言 一.静态代理的弊端 二.动态代理的优势 三.动态代理使用流程 1.目标对象接口 2.被代理对象 3.调用处理程序 4.客户端 四.动态生成 代理对象 类 的 字节码 文件数据 前言 代 ...
- 【设计模式】代理模式 ( 动态代理 )
文章目录 一.动态代理使用流程 二.动态代理代码示例 1.订单类 2.Service 接口 3.Service 实现类 4.Service 静态代理类 5.Dao 接口 6.Dao 实现类 7.Ser ...
- Proxy 代理模式 动态代理 CGLIB
代理的基本概念 几个英文单词: proxy [ˈprɒksi] n. 代理服务器:代表权:代理人,代替物:委托书: invoke [ɪnˈvəʊk] vt. 乞灵,祈求:提出或授引-以支持或证明:召鬼 ...
- 简要说明类的结构java_【深入Java虚拟机】之二:Class类文件结构
平台无关性 Java是与平台无关的语言,这得益于Java源代码编译后生成的存储字节码的文件,即Class文件,以及Java虚拟机的实现.不仅使用Java编译器可以把Java代码编译成存储字节码的Cla ...
- abstract类_「深入Java虚拟机」之二:Class类文件结构
平台无关性 Java是与平台无关的语言,这得益于Java源代码编译后生成的存储字节码的文件,即Class文件,以及Java虚拟机的实现.不仅使用Java编译器可以把Java代码编译成存储字节码的Cla ...
- 深入理解Java虚拟机二(类加载器和类的加载过程)
类加载器子系统作用 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识. ClassLoader只负责class文件的加载,至于它是否可以运行,则由Ex ...
最新文章
- ADI射频电路计算小工具ADIsimRF介绍
- 82. Leetcode 23. 合并K个升序链表 (排序)
- ORACLE数据库基本操作命令
- figma设计_5位来自杂乱无章的设计师的Figma技巧
- supersocket缓冲区_使用Socket从Client传输文件到Server对文件缓冲区大小有限制么?...
- html 正方形缩略图,html – 纯CSS图像缩略图
- 单实例设计模式的实现
- 自定义类—C#基础回顾
- spark数据倾斜解决之提高并行度
- php页面不刷新 图片的src不更新,详解iframe的src指向的内容不刷新的解决办法
- 小熊在线一键重装系统教程
- Android可拖动对话框Dialog
- JUC学习之共享模型之工具上之线程池浅学
- 简述计算机五种常见动画及特点。【可拆成多个简答】
- 研究生入门,如何高效阅读论文
- HI3559算法移植之OpenCV图像拼接、配准和图像融合技术(四)
- Navicat Premium 历史版本下载地址(官方)
- 看我是如何跟羊毛党战斗的之我也变成羊毛党
- 国开电大 管理会计 形考任务
- 如何办理《网络出版服务许可证》