官术网_书友最值得收藏!

3.2.1 JDK動態代理

在JDK自帶的動態代理中存在一個InvocationHandler接口,我們首先要做的就是提供一個該接口的實現類,如代碼清單3-7所示。

代碼清單3-7 InvocationHandler接口實現類代碼

public class AccountHandler implements InvocationHandler{
    private Object obj;

    public AccountHandler(Object obj) {
        super();
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] arg)
            throws Throwable {
        Object result = null;
        doBefore();
        result = method.invoke(obj, arg);
        doAfter();
        return result;
    }

    public void doBefore() {
        System.out.println("開戶前");
    }

    public void doAfter() {
        System.out.println("開戶后");
    }
}

InvocationHandler接口中包含一個invoke()方法,我們必須實現這一方法。在該方法中,通常需要調用method.invoke()方法執行原有對象的代碼邏輯,然后可以在該方法前后添加相應的代理實現。在上述代碼中,我們只是簡單打印了日志。

然后,編寫測試類來驗證上述AccountHandler類的執行效果,如代碼清單3-8所示。

代碼清單3-8 AccountHandler測試類代碼

public class AccountTest {
    public static void main(String[] args) {
        Account account = new RealAccount("tianyalan");
        InvocationHandler handler = new AccountHandler(account);

        Account proxy = (Account)Proxy.newProxyInstance(
            account.getClass().getClassLoader(),
            account.getClass().getInterfaces(),
            handler);
        proxy.open();
    }
}

這里的Proxy.newProxyInstance()方法的作用就是生成代理類。當該方法被調用時,RealAccount類的實例被傳入。然后當代理類的open()方法被調用時,AccountHandler中invoke()方法就會被觸發,從而實現代理機制。這里的類層次結構如圖3-4所示。

066-1

圖3-4 JDK動態代理類層次結構示意圖

仔細分析上述代碼結構,可以發現其遵循“設計并實現業務接口→實現Handler→創建代理類”這一流程,然后在Handler中構建具體的代理邏輯。上述流程也是代表了基本的代理機制實現流程。聯想一下,很多基于AOP機制的攔截器底層實際上就是類似的原理。

主站蜘蛛池模板: 黄陵县| 社旗县| 连城县| 鸡东县| 商城县| 合江县| 永新县| 西峡县| 和政县| 远安县| 平远县| 定边县| 砚山县| 叙永县| 东乡| 霍林郭勒市| 体育| 田林县| 环江| 丰镇市| 龙里县| 娄烦县| 北安市| 富蕴县| 沙洋县| 红桥区| 昌都县| 增城市| 鄂托克旗| 巴彦淖尔市| 辽宁省| 囊谦县| 布尔津县| 嵩明县| 河东区| 萨迦县| 印江| 汉川市| 长寿区| 高陵县| 宜君县|