天天看點

黑馬程式員-----代理

-------  android教育訓練 、 java教育訓練 、期待與您交流! ----------

invoke(“代理”)

代理的本質是編寫與目标類相同接口的代理類,代理類的每個方法調用目标類相同的方法,并且在調用方法時加上需要的系統功能的代碼 代理中的概念解釋:

AOP-->Aspect oriented program 面向切面程式設計

功能貫穿子產品---->交叉業務

AOP的目标就是使交叉業務子產品化

使用代理技術方案解決AOP

JVM可以在運作期動态生成類的位元組碼,往往用作代理稱作動态代理類

JVM生成的動态類必須實作一個或多個目标類繼承的接口,是以JVM生成的動态類隻能用作相同接口的目标類的代理

如果目标類沒有接口,适用CGLIB(第三方庫)可以動态生成一個類的子類

代理類需要在調用目标方法加上系統功能

可以在目标方法前,後,前後,catch塊中

通過Proxy生成動态類 

Proxy.getProxyClass(ClassLoader,Interface.class)
           

ClassLoader---->指定類加載器

Interface.class----->接口的位元組碼

建立動态類的執行個體對象

Proxy.newProxyInstance(ClassLoader,Interface.calss…[],Constructor's Parameter)
           

省去了反射建立執行個體的步驟

Interface.calss…[]
           

--->實作的接口”們”

Constructor's Parameter
           

--->構造函參數

Proxy建立的動态類的構造方法需要一個InvocationHandler類的執行個體參數

new InvocarionHandler(){
    public void invoke(Object proxy,Method method,Object [] args){
        //dosomething before
        method.invoke(target,args);
        //dosomething after
    }
}
           

proxy--->代理類對象  method--->代理方法,args---->方法需要的參數

InvocationHandler原理分析

通過代理類的構造方法傳入InvocationHandler子類對象,對象通過調用目标類方法并在前後dosth.before&&dosth.after加上系統功能代碼實作代理

InvocationHandler的invoke需要3參數,代理對象(目标對象),方法,方法執行參數

!對于從Object類下繼承的方法,隻有hashcode,equals,toString會交給invocationHandler處理,其他的不會

将系統功能封裝到對象之中,實作切面程式設計,可以寫出通用代理方法

public Object getProxy(Object target,Advice advice){
    Proxy.newProxyInstance(.....
        ......
        new InvocarionHandler(){
        ...
        advice.before();//将系統功能封裝到Advice類中
        method.invoke(target,args);
        advice.after();//将系統功能封裝到Advice類中
        ...
    }
}
           

-------   android教育訓練、 java教育訓練、期待與您交流!  ----------

  詳細請檢視: http://edu.csdn.net/heima/

繼續閱讀