1. 程式人生 > 實用技巧 >AOP_代理模式學習_動態代理

AOP_代理模式學習_動態代理

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.Integerjava.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();	//首次結果列印了 房東要出租房屋! 
    }
}