天天看點

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

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