代理模式代理商运营模式
代理模式给真实对象提供一个代理对象,并由代理对象控制真实对象的行为,客户端调用的是代理对象来完成实际的操作。
静态代理类:
由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行
前,代理类的.class文件就已经存在了。
动态代理类:在程序运行时,运用反射机制动态创建而成。
2.静态代理的缺点
如果接口添加一个新的方法,所有的实现类和代理类都要做这个实现,这就增加了代码的复杂度,而动态代理就可以解决这个问题。
3.动态代理
3.1 动态代理和静态代理相比较,最大的好处就是接口中声明的所有的方法都被转移到一个集中的方法中去
处理,这样在接口中声明的方法比较多的情况下我们
可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。
3.2 动态代理只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就
是调用被代理接口的所有方法时需要调用的,该invoke方法的返回值是被代理接口的一个实现类。
与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序
员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射
机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了
生成动态代理类的能力。
代理对象由Proxy (普赖可色) 类生成,生成过程需要用到服务类的加载类(例如serviceImpl.getClass().getClassLoader())、
接口类(serviceImpl.getClass().getInterfaces())、和一个模块对象(这个对象对应的类需要继承InvocationHandler接口)
当调用代理对象的方法时,会首先调用以上模块对象的invoke方法,在invoke方法中就可以加入横
向服务(例如安全性检查等等),然后利用反射机制就可以调用原服务类的方法。
动态代理与原代理机制最大的区别在于,动态生成的代理类将不再从 Proxy 类继承,改而继承需被代理的类。
由于 Java 的单继承原则,扩展代理机制所支持的类数目不得多于一个,但它可以声明实现若干接口。
包管理的机制与原来相似,不支持一个以上的类和接口同时为非 public;如果仅有一个非 public 的
类或接口,假设其包为 PackageA,则动态生成的代理类将位于包 PackageA;否则将位于被代理的类所
在的包。生成的代理类也被赋予 final 和 public 访问属性,且其命名规则类似地为“父类名 +ProxyN”
(N 也是递增的阿拉伯数字)。最后,在异常处理方面则与原来保持完全一致。
自定义了一个动态代理。使用Java动态代理具体有如下四步骤:
1.通过实现 InvocationHandler接口创建自己的调用处理器;
2.通过为Proxy类指定 ClassLoader对象和一组 interface 来创建动态代理类;
3.通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;
4.通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入。