AOP_代理模式學習_動態代理
阿新 • • 發佈:2020-08-01
AOP_代理模式學習
代理模式的分類:
- 靜態代理
- 動態代理
2、動態代理
- 動態代理和靜態代理角色一樣
- 動態代理類是動態生成的,不是事先寫好的
- 動態代理可以分為兩大類:基於介面的動態代理,基於類的動態代理
- 基於介面:JDK動態代理【我們在這裡使用】
- 基於類:cglib
- java位元組碼實現:javasist
需要了解兩個類:Proxy:代理,InvocationHandler:呼叫處理程式
InvocationHandler invoke方法:
Object invoke(Object proxy, Method method, Object[] args) throws Throwable
處理代理例項上的方法呼叫並返回結果。 當在與之關聯的代理例項上呼叫方法時,將在呼叫處理程式中呼叫此方法。
-
引數
proxy
- 呼叫該方法的代理例項method
-所述方法
對應於呼叫代理例項上的介面方法的例項。方法
物件的宣告類將是該方法宣告的介面,它可以是代理類繼承該方法的代理介面的超級介面。args
-包含的方法呼叫傳遞代理例項的引數值的物件的陣列,或null
如果介面方法沒有引數。 原始型別的引數包含在適當的原始包裝器類的例項中,例如java.lang.Integer
或java.lang.Boolean
。
程式碼測試:
1、建立Rent介面:
public interface Rent{ public void rent(); }
2、建立Host房東類
public class Host implements Rent{
public void rent(){
System.out.println("房東要出租房屋!");
}
}
3、建立代理處理程式類ProxyInvocationHandler
//等會我們會用這個類,自動生成代理類 public class ProxyInvocationHandler implements InvocationHandler{ //被代理的介面 private Rent rent; public void setRent(Rent rent){ this.rent = rent; } //建立代理類 public Object getProxy{ return Proxy.newProxyInstance(this.getClass.getClassLoader(),rent.getClass.getInterfaces(),this); } //處理代理例項,並返回結果 public Object invoke(Object proxy,Method method,Object[] args)throws Throwable{ seeHouse(); //動態代理的本質,就是使用反射機制實現 Object result = method.invoke(rent,args); free(); hetong(); return result; } //中介的看房 public void seeHouse(){ System.out.println("中介帶你去看房!"); } //中介收中介費 public void free(){ System.out.println("中介收中介費!"); } //中介籤租賃合同 public void hetong(){ System.out.println("籤租賃合同!"); } }
4、編寫Client測試類
public class Client{
public static void main(String[] args){
//真實角色
Host host = new Host();
//代理角色,現在沒有
ProxyInvocationHandler pih = new ProxyInvocationHandler();
pih.setRent(host); //設定要代理的物件
Rent proxy = (Rent)pih.getProxy(); //這裡的proxy是動態生成的,我們並沒有寫
proxy.rent(); //首次結果列印了 房東要出租房屋!
}
}