代理模式的本质:创建一个代理类替代业务类,将非业务代码写在代理类中,保留业务类的纯净,同时增加代码的可扩展性
文章目录
一:动态代理的本质
创建一个通用代理类(调用处理类),通过反射动态创建需要的代理类
二:优点
1:保留业务类的纯净
2:增加代码的可扩展性
3:一个通用代理类可以给多个业务类使用
即:在保留了静态代理所有优点的同时,也不会增加过多的代码量
三:主要用到的类
1:Proxy
在jdk1.8的文档中是这样描述Proxy的:Proxy提供了创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类
意思就是:Proxy就是用来创建动态代理类的,且它是其创建出来的所有代理类的父类之一
主要方法:newProxyInstance(ClassLoader, Class<?>[], InvocationHandler)
2:InvocationHandler
在jdk1.8的文档中是这样描述 InvocationHandler 的:每个代理实例都有一个关联的调用处理程序。 当在代理实例上调用方法时,方法调用将被编码并分派到其调用处理程序的invoke方法。
意思就是:InvocationHandler 是用来执行调用方法的,当动态代理类执行方法时,会跳转到 InvocationHandler 中的 invoke 方法执行
主要方法:invoke(Object, Method, Object[])
三:例子
1:结构
2:Send 业务接口
public interface Send {
void send();
}
3:Host 业务类
public class Host implements Send{
@Override
public void send() {
System.out.println("房东出租房子");
}
}
4:SelfInvocationHandler 通用代理类
public class SelfInvocationHandler implements java.lang.reflect.InvocationHandler {
private Object object;
public void setSend(Object object) {
this.object = object;
}
public Object getProxy(){
return Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), object.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
log(method.getName());
Object invoke = method.invoke(object, args);
return invoke;
}
public void log(String s){
System.out.println("执行了"+s+"方法");
}
}
5:Client 调用者
public class Client {
public static void main(String[] args) {
Host host = new Host();
SelfInvocationHandler selfInvocationHandler = new SelfInvocationHandler();
selfInvocationHandler.setSend(host);
Send proxy = (Send) selfInvocationHandler.getProxy();
proxy.send();
}
}