想要了解动态代理模式,首先要理解基本的静态动态模式的意思和组织形式。
一、代理模式
为什么要用
被代理的对象可以是远程的对象、创建开销大的对象或需要安全控制的对象,这同时也是他的意义
二、如何用
代理模式主要分为静态模式和动态模式,要从静态模式入手进行理解。
1、静态代理
image.png1、RealSubject 是最终处理的委托类,Proxy 是代理类,可以理解为代理委托;
2、Subject 是委托类和代理类的接口,即代理类和委托类都应实现该接口;
3、request() 是委托类和代理类的共同方法;
interface Subject {
void request();
}
class RealSubject implements Subject {
public void request(){
System.out.println("RealSubject");
}
}
class Proxy implements Subject {
private Subject subject;
public Proxy(Subject subject){
this.subject = subject;
}
public void request(){
System.out.println("begin");
subject.request();
System.out.println("end");
}
}
public class ProxyTest {
public static void main(String args[]) {
RealSubject subject = new RealSubject();
Proxy p = new Proxy(subject);
p.request();
}
}
静态代理实现中,一个委托类对应一个代理类,代理类在编译期间就已经确定。
二、动态代理
java通过反射机制提供了对代理的支持,利用java.lang.reflect在运行时动态地创建一个代理类,实现一个或多个接口,并将方法转发到你所指定的类。因为实际的代理类是在运行时创建的,所以称为动态代理。
image.png
java为我们创建了proxy类,我们需要告诉运行期建立的动态proxy,我们到底要做什么,因为这是运行期创建的,我们无法直接在里面写代码,如调用真正的委托类。因此,我们需要放在一个规定的地方,即InvocationHander,他的任务就是响应代理的任何调动,目的是去请求时间做工作的对象。
最重要的地方
理清proxy和InvocationHander的关系,Invocation只是一个辅助proxy的类,真正的proxy类是利用Proxy.newProxyInstance在运行期间动态创建的。
Proxy.newProxyInstance((ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h));
java动态代理的实现机制
参考文档:https://blog.csdn.net/mantantan/article/details/51873755
动态代理的扩展(了解)
java自带只能创建接口类的代理,但如果是普通类,需要使用Cglib,这是通过字节码的操作,创建代理。
网友评论