首页 > 代码库 > java的静态代理和动态代理(jdk、cglib)
java的静态代理和动态代理(jdk、cglib)
一、代理模式
代理的概念来自于设计模式中的代理模式,先了解一下代理模式
1、结构图
2、参与者
Subject:接口,定义代理类和实际类的共用接口
RealSubject:实际类,实现Subject这个接口
Proxy:代理类,实现Subject这个接口,内部引用一个RealSubject实际类
3、描述
Proxy实现了Subject接口,内部引用一个RealSubject实际类,RealSubject能做的Proxy都会
于是Proxy代替了RealSubject,实例化到Subject里交给客户端调用,而客户端不知道自己实际用的是谁
客户端调用了Subject接口中的Request()方法,实际上访问的是Proxy
Proxy类提供了一个客户端对RealSubject的间接性访问的过程,在这个过程中可以做很多的控制
4、意图
控制对象的访问
5、应用场景
虚代理:根据需要来创建开销很大的对象,该对象只有在需要的时候才会被真正创建
远程代理:用来在不同的地址空间上代表同一个对象,这个不同的地址空间可以是在本机,也可以在其他机器上,在java里面最典型的就是RMI技术
copy-on-write代理:在客户端操作的时候,只有对象确实改变了,才会真的拷贝(或克隆)一个目标对象,算是虚代理的一个分支
保护代理:控制对原始对象的访问,如果有需要,可以给不同的用户提供不同的访问权限,以控制他们对原始对象的访问
Cache代理:为那些昂贵操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果
防火墙代理:保护对象不被恶意用户访问和操作
同步代理:使多个用户能够同时访问目标对象而没有冲突
二、静态代理
java中的静态代理就是代理模式最简单的实现,下面是示例代码:
//接口public interface Subject { void Request();}//实际类public class RealSubject implements Subject { public void Request() { System.out.println("执行具体的功能"); }}//代理类public class Proxy implements Subject { private Subject realSubject = null; public Proxy(Subject subject) { realSubject = subject; } public void Request() { System.out.println("静态代理开始"); realSubject.Request(); System.out.println("静态代理结束"); }}//客户端public class Client { public static void main(String[] args) { RealSubject realSubject = new RealSubject(); realSubject.Request(); Subject subject = new Proxy(realSubject); subject.Request(); }}
java的静态代理和动态代理(jdk、cglib)