JDK的動态代理首先看InvocationHandler接口
public
interface InvocationHandler
extends Callback
{
public
abstract Objectinvoke(Object obj, Methodmethod, Object
aobj[])
throws Throwable;
}
這個接口隻有一個invoke方法
第一個參數是代理的真實的對象
第二個參數是調用真實對象的方法
第三個是調用方法需要的參數
再看下Proxy類,用的最多的是裡面的newProxyInstance方法
class Proxy
implements Serializable
public
static Object newProxyInstance(ClassLoader loader, Class interfaces[], InvocationHandler h)
{
Class clazz = getProxyClass(loader,interfaces);
return clazz.getConstructor(new Class[] {
org.springframework.cglib.proxy.InvocationHandler.class
}).newInstance(new Object[] {
h
});
RuntimeException e;
e;
throw e;
throw
newCodeGenerationException(e);
}
這個方法的第一個參數是一個ClassLoader對象,定義了由哪個ClassLoader對象來生成代理對象進行加載
第二個參數是一個interfaces的數組,表示我将要給我代理的對象提供什麼接口,這樣生成代理的對象的時候就可以調用這些接口裡面的方法
第三個參數是一個InvocationHandler對象,表示這個動态代理對象調用方法的時候會關聯到哪個invocationHandler對象
在整個動态代理模式中,每一個代理類都要實作InvocationHandler接口,每一個代理類對象都是一個InvocationHandler對象
這個代理類提供了一個構造方法,參數是Object 類,代表這個代理類對象生成時真正代理的對象
在代理類裡面會執行Method對象的invoke方法執行真實對象的方法
而在用戶端我們會先通過這個代理類得到InvocationHandler對象
然後通過Proxy類的newProxyInstance方法去得到這個真實的對象,然後調用
整個的流程應該是
說到動态代理,就不得不提到spring的Aop的實作
Aop的動态代理實作需要四個角色,被代理的類,被代理的接口,織入器,和切面
Proxy.newProxyInstance就是織入器,InvocationHandler是切面,首先織入器利用接口反射機制生成代理類,然後在這個代理類中織入方法,織入的是切面的方法,spring中預設的是動态代理機制試下Aop,因為動态代理機制下代理類必須要實作接口,如果代理類沒有實作接口,則采用CGlib機制實作Aop,CGlib機制後續再進行補充