Java设计模式——代理模式(proxy)
代理模式(proxy)还是挺难理解的。为了能够清晰的了解它的原理,我看了好几遍。。。以下为学习总结
*****************************************************************************************************************
proxy应用的场景:为其他的对象提供一种代理,以控制对该对象的访问。eg. 房屋中介、婚介所、快递等
代理的目的是拿到目标对象的引用,并调用目标类的业务方法。
代码中dynamic proxy的体现为JDK中的Proxy类和cglib(后续)
一、代理的分类(静态代理和动态代理)
(一)静态代理(static proxy):将目标对象作为代理对象的一个成员变量的引用,代理对象方法中调用目标对象的业务方法。调用者通过调用代理对象的方法而调用成员目标对象的业务方法。
优点:符合open-close原则
缺点:如果目标类发生变化,则所有的代理类都需要改动——>增加代码的复杂度,维护成本较高
(二)动态代理(dynamic proxy)
1、JDK :用到了java.lang.reflect.Proxy(创建代理类)和InvocationHandler (调用方法)
备注:若想看到$Proxy0的内容:获得JDK动态代理生成类$Proxy0的内容
(1)Proxy.newProxyInstance的3个参数、返回值:
(2)重写的InvocationHandler的invoke()的3个参数和返回值:
proxy
- 在其上调用方法的代理实例
method
- 对应于在代理实例上调用的接口方法的 Method
实例
args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null
2、cglib (code generation library):代码生成类库,包含2个jar(cglib.jar 、asm.jar)
-------------纠正:Enhance 写错了,应该改为Enhancer
(三)静态代理与动态代理的区别
1、 静态代理:在代理之前,所有的东西都是已知的(代理已知的代码)
动态代理:在代理之前,所有东西都是未知的(代理未知的代码)
2、目标类若改动(比如增加一个方法),静态代理的所有代理都需要改动,动态代理的代理无须进行改动