關於靜態代理和動態代理程式碼解釋
阿新 • • 發佈:2021-07-20
#
靜態代理
####代理物件和被代理的物件其實都是為實現同一目標介面動作而被建立,只不過代理物件只是間接使用被代理物件的實現方法而去實現這個動作. 同一目標介面: //出租房子 ------------
public interface Rent { void rent(); }
被代理的物件://真實業主 ------------
public class Host implements Rent { @Override public void rent() { System.out.println("業主要出租房子"); } }
代理物件://中介 ------------
publicclass Proxy implements Rent { private Host host; public Proxy() { } public Proxy(Host host) { this.host = host; } @Override public void rent() { //實現業主租房的想法 host.rent(); } }
客戶端: ------------
1 public static void main(String[] args) { Host host = new Host(); Proxy proxy = new Proxy(host); proxy.rent(); }
動態代理模式: ------------ 動態代理就是省去了代理物件這個實體,利用反射,在需要代理物件時自動建立 同一目標介面://租房 ------------
public interface Rent { void rent(); }
被代理物件://業主租房 ------------
public class Host implements Rent { @Override public void rent() { System.out.println("房東要出租房子"); } }
動態代理物件://生成代理的中介 ------------
public class ProxyInvocationHandler implementsInvocationHandler { private Object target; public void setRent(Object target) { this.target = target; } //生成代理物件 public Object getProxy() { return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } //處理代理例項 返回結果 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object invoke = method.invoke(target, args); return invoke; } }
客戶端: ------------
public static void main(String[] args) { Host host = new Host(); ProxyInvocationHandler pih = new ProxyInvocationHandler(); pih.setRent(host); Rent proxy = (Rent) pih.getProxy(); proxy.rent(); }