動態代理的簡單闡述

動態代理有倆種方式
1.jvm代理
2.第三方庫代理cglib代理。
區別:前者被代理的類必須實現接口,後者被代理的類沒有實現接口 。 使用cglib代理需要導入第三方jar包。
下面詳細聊聊
jvm代理中,需要單獨寫一個類實現接口InvocationHandler,重寫裏面的invoke方法,這個類把代理對象回傳過來,在這個方法中可以定義代理對象要做的事,
如:
invoke(Proxy proxy,Method method Object[] args){

//代理對象替被代理對象所做的事情。還可以額外添加一些方法。如:記錄日誌。
method.invoke(被代理的對象,args);
}

產生代理對象的過程如下:

Proxy.newProxyInstance(Loader,Infaceter,h);
這個方法需要三個參數分別代表:被代理類的類加載器,被代理類實現 的接口,invocationHandle實現類的的對象。

代理對象產生後,可以直接有代理對象調用被代理類中的方法,就會觸發invocationHanle實現類中的invoke方法。

下面說說cglib代理
建一個MethodInterceptor的實現類,重寫intercept方法,這個方法中有4個參數,(Object obj, Method method, Object[] args, MethodProxy proxy)以便在方法中使用。和invoke有點類似。
在這個方法中調用proxy.invokeSuper(obj,args);
//產生代理類的工具。
Enhancer enhancer = new Enhancer();
//加載那個被代理的類。
enhancer.setSuperclass(c);
//回傳給mycglib(MethodInterceptor的實現類)那個類。
enhancer.setCallback(m);
//產生代理對象。
User p= (User)enhancer.create();
產生代理對象後,直接調用被代理類中的方法。

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