jdk動態代理示例以及程式碼原理分析
阿新 • • 發佈:2019-02-06
相信很多人在剛剛學習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)
開始分析。
待補充