先看看静态代理:
功能接口
interface ifunction {
void dothing();
}
功能提供者
class provider implement ifunction {
public void dothing {}
}
功能代理者
class proxy implement ifunction {
private provider provid;
public proxy(provider provid) {
this.provid = provid;
}
public void dothing{
provid.dothing();
}
}
前两者就是普通的接口和实现类,而第三个就是所谓的代理类。对于使用者而言,他会让代理类去完成某件任务,并不关心这件任务具体的跑腿者。
如果接口越多,每新增一个函数都要去修改这个 proxy
代理类:把委托类对象传进去,实现接口
动态代理
功能代理者
class proxy implement InvocationHandle {
private Object obj;
public Object bind(Object obj) {
this.obj = obj;
}
public void invoke(Object proxy,Method method,Objects[] args) throws Throwable{
return method.invoke(obj, args);
}
}
provider provid = new provider()
ifunc i = (ifunc) new proxy().bind(provid)
i.dothing()
代理类和委托类 互相透明独立,逻辑没有任何耦合,在运行时才绑定在一起。
动态代理的核心思想是通过 Java Proxy 类,为传入进来的任意对象动态生成一个代理对象,这个realSubject代理对象默认实现了功能代理者的所有接口。内部实现了接口对应的所有方法,内部接口方法在调用时最终会调用到proxy的invoke函数中。super.h.invoke(this, m3, (Object[])null);
动态代理并不复杂,通过一个 Proxy 工具,为委托类的接口自动生成一个realProxy代理对象,后续的函数调用都通过这个代理对象进行发起,最终会执行到 InvocationHandler#invoke
方法