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


静态代理::3d
- 就是把被代理对象包起来,任何人要访问被代理对象,就来找我,我是全权代理
动态代理::代理
本身动手实现一个 动态代理::对象
调用方法:blog
- 传入被具体的代理类(返回结果是被代理类实现的接口)

CustomMeipo 具体实现继承
- 继承 GPInvocationHandler 调用钩子接口
- 把引用保存起来

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


基本原理:接口
- 具体实现有:类 GPProxy、GPInvocationHandler 接口、GPClassLoader 类
GPInvocationHandler 接口ip
- 回调钩子接口
- 提供方法调取钩子方法,用于客户加强方法功能

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

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