1. 程式人生 > >jdk動態代理示例以及程式碼原理分析

jdk動態代理示例以及程式碼原理分析

相信很多人在剛剛學習Java時,會感覺【動態代理】晦澀難懂,只知道如何來呼叫它,卻不知道它的實現細節。本文通過根據JDK原始碼,展示這些細節,以期能對JDK的動態代理有深入的理解。

簡單示例程式碼


public class ProxyInstance implements Product {

    public void show() {
        System.out.println("這是原本的類");
    }

}

public class JdkProxyTest {

    public static void main(String[] args) {
        final
ProxyInstance target = new ProxyInstance(); Product proxy = (Product)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws
Throwable { System.out.println("代理的前置方法"); Object object = method.invoke(target, args); System.out.println("代理的後置方法"); return object; } }); proxy.show(); } }

執行後的列印程式碼如下:

代理的前置方法
這是原本的類
代理的後置方法

基於JDK的動態代理最終都是呼叫了上面型別的程式碼來實現。有時候感覺動態代理難以理解,是因為示例程式碼中有幾個地方隱藏了實現細節,讓人無法完全明白這個過程到底發生了什麼。需要搞清楚的有以下2點:

①既然說到代理,那麼這個代理是何時、如何建立的?
②上面注入的InvocationHandler裡的invoke方法由誰來呼叫執行?

程式碼分析

我們從Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)開始分析。

待補充