文章目录

  • 前言
  • 一、模拟 JVM 生成对应的 代理对象
  • 二、模拟 JVM 生成对应的 代理对象 完整流程展示
    • 1、目标对象接口
    • 2、被代理对象
    • 3、调用处理程序
    • 4、模拟 JVM 生成的代理对象类
    • 5、客户端

前言

动态代理使用流程 :

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

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

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

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

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

本篇博客 基于 【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 ) 三、动态代理使用流程 中的示例 , 模拟写出一个由 Java 虚拟机自动生成的字节码类 ;

一、模拟 JVM 生成对应的 代理对象


下面的类基本 JVM 动态生成的类功能一致 ;

在该动态生成的类中 , 持有 被代理对象 和 调用处理程序 ;

在每个 目标对象 接口方法中 , 使用反射获取对应的方法 , 将

  • 反射获取的 Method 对象实例 ,
  • 持有的 被代理对象实例 ,
  • 方法参数 ,

全部传入 调用处理程序 InvocationHandler 的 invoke 方法中 ;

这也是所有的 目标对象 方法 , 都能在 InvocationHandlerinvoke 方法中回调到的原因 ;

生成的代码示例 :

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 虚拟机生成对应的 代理对象 类 )相关推荐

  1. 红橙Darren视频笔记 代理模式 动态代理和静态代理

    红橙Darren视频笔记 代理模式 动态代理和静态代理(Android API 25) 关于代理模式我之前有过相关的介绍: https://blog.csdn.net/u011109881/artic ...

  2. 小菜成长记---【proxy 代理模式 ---西门庆干潘金莲——王婆做代理】

    西门庆找潘金莲,潘金莲肯定不会答应,咋办找个王婆做代理呗. 西门庆干潘金莲的事我就不说了大家心里明的像镜似的.. 程序代码实现如下: 定义女人接口,以及方法. 潘金莲实现女人接口,以及方法. 王婆实现 ...

  3. Java设计模式-之代理模式(动态代理)

    一.简介 1.什么叫代理模式:        简而言之就是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起 ...

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

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

  5. 【设计模式】代理模式 ( 动态代理 )

    文章目录 一.动态代理使用流程 二.动态代理代码示例 1.订单类 2.Service 接口 3.Service 实现类 4.Service 静态代理类 5.Dao 接口 6.Dao 实现类 7.Ser ...

  6. Proxy 代理模式 动态代理 CGLIB

    代理的基本概念 几个英文单词: proxy [ˈprɒksi] n. 代理服务器:代表权:代理人,代替物:委托书: invoke [ɪnˈvəʊk] vt. 乞灵,祈求:提出或授引-以支持或证明:召鬼 ...

  7. 简要说明类的结构java_【深入Java虚拟机】之二:Class类文件结构

    平台无关性 Java是与平台无关的语言,这得益于Java源代码编译后生成的存储字节码的文件,即Class文件,以及Java虚拟机的实现.不仅使用Java编译器可以把Java代码编译成存储字节码的Cla ...

  8. abstract类_「深入Java虚拟机」之二:Class类文件结构

    平台无关性 Java是与平台无关的语言,这得益于Java源代码编译后生成的存储字节码的文件,即Class文件,以及Java虚拟机的实现.不仅使用Java编译器可以把Java代码编译成存储字节码的Cla ...

  9. 深入理解Java虚拟机二(类加载器和类的加载过程)

    类加载器子系统作用 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识. ClassLoader只负责class文件的加载,至于它是否可以运行,则由Ex ...

最新文章

  1. ADI射频电路计算小工具ADIsimRF介绍
  2. 82. Leetcode 23. 合并K个升序链表 (排序)
  3. ORACLE数据库基本操作命令
  4. figma设计_5位来自杂乱无章的设计师的Figma技巧
  5. supersocket缓冲区_使用Socket从Client传输文件到Server对文件缓冲区大小有限制么?...
  6. html 正方形缩略图,html – 纯CSS图像缩略图
  7. 单实例设计模式的实现
  8. 自定义类—C#基础回顾
  9. spark数据倾斜解决之提高并行度
  10. php页面不刷新 图片的src不更新,详解iframe的src指向的内容不刷新的解决办法
  11. 小熊在线一键重装系统教程
  12. Android可拖动对话框Dialog
  13. JUC学习之共享模型之工具上之线程池浅学
  14. 简述计算机五种常见动画及特点。【可拆成多个简答】
  15. 研究生入门,如何高效阅读论文
  16. HI3559算法移植之OpenCV图像拼接、配准和图像融合技术(四)
  17. Navicat Premium 历史版本下载地址(官方)
  18. 看我是如何跟羊毛党战斗的之我也变成羊毛党
  19. 国开电大 管理会计 形考任务
  20. 如何办理《网络出版服务许可证》

热门文章

  1. Linux vim 梳理
  2. 《大道至简》阅读笔记二
  3. Golang入门教程(十七)Linux/Windows下快速搭建和配置NSQ
  4. asp.net core mvc 异步表单(Ajax.BeginForm)
  5. JQuery面试题1
  6. Repeater控件
  7. Java序列化和克隆
  8. 用VB.net开发.NET Micro Framework
  9. 使用 $.grep() 方法
  10. PHP 的 cURL库快速入门文档