咕泡-代理 proxy 设计模式笔记

##查看代码:https://gitee.com/jly521/proxy.git

代理模式(Proxy)

  • 应用场景:为其他对象提供一种代理以控制对这个对象的访问
    • 从结构上来看和Decorator 模式类似,
    • 但Proxy 是控制,更像是一种对功能的限制,而Decorator 是增加职责
  • Spring 的Proxy 模式在AOP 中有体现,比如JdkDynamicAopProxy 和Cglib2AopProxy(就是 JDK动态代理和 CGLIB 动态代理)

d3a731d35aec834499c0c5951f86647fd1f.jpg

  • 静态代理和动态代理

202037f3bc9aac3c702d7889b4a72d856f9.jpg

静态代理::

  • 就是把被代理对象包起来,任何人要访问被代理对象,就来找我,我是全权代理

动态代理::

  • jdk 动态代理 和 cglib 动态代理

自己动手实现一个 动态代理::

调用方法:

  • 传入被具体的代理类(返回结果是被代理类实现的接口)

686ca14419fa5c9ebce811c6a654b7ecff1.jpg

CustomMeipo 具体实现

  • 继承 GPInvocationHandler 调用钩子接口
  • 把引用保存起来

456744ee34ea90a5cc82ceb00ba93e03e7f.jpg

  • 生成实例
    • 注意,此处的实例其实是被代理类的封装子类,从实现原理中我们会知道该子类是动态生成的
  • 传入参数 GPInvocationHandler 是调用钩子(本类继承了该接口,钩子可以传自己)

090179e5bed5f64737552dcb83a8582bde6.jpg

  • 实现 钩子接口方法,增强被代理类的方法实现

3228185911b4d7615fc3c97c25af6f75575.jpg

基本原理:

  • 具体实现有:类 GPProxy、GPInvocationHandler 接口、GPClassLoader 类

GPInvocationHandler 接口

  • 回调钩子接口
  • 提供方法调取钩子方法,用于客户增强方法功能

f07ef7ccaf24013d553c14c1d5023a92e96.jpg

GPClassLoader::

  • GPClassLoader 继承 ClassLoader 
  • 用于编译生成的临时文件 $Proxy0.java 获得$Proxy0.class,加载到JVM中来

8dfae7d114ce15016000cda0bd38cc1dc90.jpg

GPProxy::

  • 主实现类,生成一个新的实例,即被实现类的 增强实例(生成的这个类很像静态代理类,不过此处是动态生成的)
    1. 动态生成源代码.java文件 $Proxy0.java(在GPProxy 相同目录下)
    2. Java文件输出磁盘
    3. 把生成的.java文件编译成.class文件(删除.java文件)
    4. 编译生成的.class文件加载到JVM中来
    5. 返回字节码重组以后的新的代理对象(传入回调钩子)

06ca571dd779f28d46c65688ea469523bf7.jpg

转载于:https://my.oschina.net/u/3847203/blog/1932341

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值