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

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

代理模式(Proxy)git

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

  • 静态代理和动态代理

静态代理::3d

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

动态代理::代理

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

本身动手实现一个 动态代理::对象

调用方法:blog

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

CustomMeipo 具体实现继承

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

  • 生成实例
    • 注意,此处的实例实际上是被代理类的封装子类,从实现原理中咱们会知道该子类是动态生成的
  • 传入参数 GPInvocationHandler 是调用钩子(本类继承了该接口,钩子能够传本身)

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

基本原理:接口

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

GPInvocationHandler 接口ip

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

GPClassLoader::get

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

GPProxy::

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

相关文章
相关标签/搜索