開發與維運

2.3.2 JDK動態代理 -《SSM深入解析與項目實戰》

2.3.2  JDK動態代理

JDK動態代理是由Java內部使用反射機制來實現的。使用JDK動態代理必須是委託類實現統一的接口,否則JDK動態代理不能應用。雖然有一定的侷限性,但是影響不大。java.lang.reflect包中的Proxy類和InvocationHandler 接口提供了生成動態代理類的能力。所以如果需要代理,我們代理類必須InvocationHandler 接口或者繼承Proxy類。建議使用InvocationHandler 接口來進行實現代理類。

繼續前面的支付場景,我們用JDK動態代理來實現。

首先定義一個支付接口和兩個實現類,也就是我們的目標類。

實現類和接口

代碼清單2-16:實現類和接口

/**
 * 接口  支付的通用接口方法 
 */
public interface Pay {
    void pay(String operation);
}

/**
 * 委託類  - 一種支付方式 
 */
public class AliPay implements Pay {
    @Override
    public void pay(String operation) {
        System.out.println("進行AliPay支付,操作:" + operation);
    }
}

/**
 * 委託類 - 另一種支付方式 
 */
public class WxPay implements Pay {
    @Override
    public void pay(String operation) {
        System.out.println("進行WxPay支付,操作:" + operation);
    }
}

接下來是重點,也就是我們的代理類。

代碼清單2-17:代理類PayProxy

/**
 * JDK動態代理類 
 */
public class PayProxy implements InvocationHandler {
    private Object target;
    /**
     * 構造方法,需要實現代理的真實對象 
     * @param target
     */
    public PayProxy(Object target) {
        this.target = target;
    }

    /**
     * 負責處理動態代理類上的方法調用
     * 根據三個參數進行預處理或者分派到不同的委託類實例上使用反射進行執行
     *
     * @param proxy  被代理的對象
     * @param method 要調用的方法
     * @param args   方法調用時所需要的參數
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //在進行執行目標方法前可以進行操作
        System.out.println("調用之前...");
        System.out.println("Method:" + method);
        //調用真實對象的方法,會跳轉到代理對象關聯的handler對象的invoke方法來進行調用,內部通過類反射實現
        Object result = method.invoke(target, args);
        //在進行執行目標方法後可以進行操作
        System.out.println("調用之後...");
        return result;
    }
}

更多內容請閱讀原文:
https://chenhx.blog.csdn.net/article/details/108011513

Leave a Reply

Your email address will not be published. Required fields are marked *