java設計模式:動態代理模式

所謂動態代理,即通過代理類: Proxy的代理, 接口和實現類之間可以不直接發生聯繫,而可以在運行期( Runtime)實現動態關聯。I
java動態代理主要是使用java.lang.reflect包中的兩個類。

InvocationHandler類
public Object invoke(Object obj,Method method,Object[] obs)
其中第一個參數obj指的是代理類,method是被代理的方法,obs是指被代理的方法的參數組。此方法由代理類來實現。

Proxy類
protected Proxy(InvocationHandler h);
static Class getProxyClass(ClassLoader loader,Class[] interfaces);
static Object newProxyInstance(ClassLoader loader,Class[]interfaces,InvocationHandler h);
動態代理其實是在運行時生成class,所以,我們必須提供一組interface,然後告訴他class已經實現了這些interface,而且在生成Proxy的時候,必須給他提供一個handler, 讓他來接管實際的工作。

代碼示例:
測試主類:

package proxy;

public class Test {
    public static void main(String[] args) {
        Person person = new Person();
        CreateProxy createProxy = new CreateProxy();
        Subject o = (Subject)createProxy.create(person);
        o.shopping();//invoke
    }
}
/**
運行結果:
搭建平臺.....
商品選品
付款,買到一大堆零食
完成交易!
*/

Subject 類

package proxy;

public interface Subject {
    public void shopping();
}

Person 類

package proxy;

public class Person implements Subject {
    @Override
    public void shopping() {
        System.out.println("付款,買到一大堆零食");
    }
}

CreateProxy類:

package proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//用於動態生成代理對象
public class CreateProxy implements InvocationHandler {
    private Object target;//相當於Person對象

    public Object create(Object target){
        this.target=target;
        //創建代理對象,參數爲類加載器,對象所在類的接口
        Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
        return proxy;
    }
    //代理對象要執行的方法
    //proxy:代理對象
    //method:被代理要執行的方法(即shopping)
    //args:被代理對象的參數
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("搭建平臺.....");
        System.out.println("商品選品");
        //反射獲取方法
        method.invoke(target,args);
        System.out.println("完成交易!");
        return null;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章