动态代理模式和静态代理模式
静态代理模式:首先我们开看一张图

静态代理或者动态代理我们要明白代理其中代理的意思:就是通过一个媒介去代理来达成某个目的
上图中相亲网站就代理了广大相亲的美丽女士去和刘建龙进行约会(这个代理的顺序很重要,而不是相亲公司代理刘建龙)
这里引用b站狂神的几句经典的话

由此可见:广大女性(Lady真实角色)有约会(Date抽象角色)的需求,婚庆公司(proxy代理角色)帮助实现,客户(Client刘建龙)
demo结构:

代码:
public interface Date { void date(); }
public class Lady implements Date { public void date() { System.out.println("与刘建龙甜蜜的约会成功"); } }
public class Proxy implements Date { //组合进去 Lady lady; public Proxy() { } public Proxy(Lady lady) { this.lady = lady; } public void date() { lady.date(); } }
public class Client { public static void main(String[] args) { Lady lady = new Lady(); Proxy proxy = new Proxy(lady); proxy.date(); } }
值得注意的是,在写代理类的时候,要把你要代理的引用放进去,之后Client中的运行结果:

那么动态代理就是自动的生成你所要代理的类(相当于自动给你生成一个proxy)
那么就需要一个工具类:
//等会我们会用这个类来自动生成代理类 public class ProxyInvocationHandler implements InvocationHandler { //被代理的接口 //代理谁 private Object target; public void setTarget(Object target) { this.target = target; } //生成得到代理类 //生成代理类 public Object getProxy(){ return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this); } //处理代理实例,并返回结果 //调用代理程序的一些执行方法 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //动态代理的本质就是使用反射机制实现 Object result = method.invoke(target, args); return result; } }
运用了反射的知识
public class Client { public static void main(String[] args) { Lady lady = new Lady(); ProxyInvocationHandler pih = new ProxyInvocationHandler(); pih.setTarget(lady); Date proxy = (Date) pih.getProxy(); proxy.date(); } }
运行结果也是一样的

关键是要弄清楚你要代理哪一个真实的角色,才是代理的关键
浙公网安备 33010602011771号