JDK動態代理

JDK代理必須要藉助一個接口才能產生代理對象。

定義接口:

public interface User {
    void say(String str);
    void haha();
}

定義接口實現類:

public class UserImp implements User {
    @Override
    public void say(String str) {
        System.out.println("asd"+str);
    }

    @Override
    public void haha() {
        System.out.println("哈哈");
    }
}

動態代理類(必須實現InvocationHandler接口的invoke方法 ):

public class JDKProxy implements InvocationHandler {
	 // 需代理的對象target 
    private Object target =null;

	/*
	* 獲取代理對象
	*       newProxyInstance方法的三個參數:
	*               1. 需代理的對象的類加載器
	*               2. 需代理的對象的接口(將代理對象掛在這個接口上)
	*               3. 一個執行代理邏輯的對象(該對象必須實現InvocationHandler接口)
	* */
	public Object getProxy(Object obj){
	    target= obj;
	    return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
	}

    /*
    *  執行代理邏輯,代理對象proxy(掛在User接口下)每調用接口方法時,都是通過調用invoke去調用。
    * */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("代理前的邏輯");
        // 這裏執行真實的方法
        Object obj = method.invoke(target, args);
        System.out.println("代理後的邏輯");
        return obj;
    }
}

測試類:

/*
* JDK代理
* */
@Test
public void test(){
    JDKProxy jdk = new JDKProxy();
    // 產生代理對象
    User proxy = (User)jdk.getProxy(new UserImp());

    // 調用真實方法
    proxy.haha();
    proxy.say("asdasda");
}

結果:
false
代理前的邏輯
哈哈
代理後的邏輯
代理前的邏輯
asdasdasda
代理後的邏輯

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章