日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Java动态代理invoke方法自动执行的原因

發布時間:2024/1/1 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java动态代理invoke方法自动执行的原因 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java動態代理invoke方法自動執行的原因

在動態代理中,一般的是先調用Proxy.newProxyInstance()生成代理對象,然后通過調用代理對象的對應方法來實現增強,這里假設代理了被代理對象的test()方法。其中增強的邏輯寫在處理器中(InvocationHandler處理器常通過匿名內部類創建)。當調用代理對象的test方法時,處理器中的invoke方法會自動執行,這一點較難理解。以下嘗試從源碼的角度對動態代理的機制進行簡要分析。

Proxy類中的主體部分:

public class Proxy implements Serializable{//the invocation handler for this proxy instance.protected InvocationHandler h;}/** parameter types of a proxy class constructor */private static final Class<?>[] constructorParams ={ InvocationHandler.class };//構造器protected Proxy(InvocationHandler h) { this.h = h;}//該方法返回類型為(com.sun.proxy.$Proxy0)的代理對像public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)//Look up or generate the designated proxy class. Class<?> cl = getProxyClass0(loader, intfs);final Constructor<?> cons = cl.getConstructor(constructorParams);final InvocationHandler ih = h; return cons.newInstance(new Object[]{h}); }

$Proxy0類中的主體(代理對象是該類的實例)

//以下代碼由$Proxy0.class反編譯得到 public final class $Proxy0 extends Proxy implements PorxyInte {private static Method m3; static { m3 = Class.forName("cn.itcast.web.Test.PorxyInte").getMethod("test", new Class[0]); } //構造方法。將invocationhandler實例從代理類賦值到父類public $Proxy0(InvocationHandler invocationhandler){super(invocationhandler);//創建父類對象}//此處可以看出,當調用代理類的test方法,會執行父類對象屬性h的invoke方法,//h即為通過匿名內部類創建的處理器對象public final void test() {super.h.invoke(this, m3, null); //這里的this是代理對象,m3為test方法 }

通過匿名內部類創建處理器(InvocationHandler對象),

即Proxy.newProxyInstance()方法中的第三個參數

new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//此處可以寫增強參數和方法的代碼 Object result = method.invoke(proImp,null);return result;//此處可以寫增強結果的代碼 }

通過以上代碼不難看出,代理對象創建時也創建了父類對象,并將處理器傳給了父類對象,通過調用代理對象的test()方法,執行了父類對象中處理器的invoke方法。

說明:為了直觀,本文中修改了部分源代碼,若有理解不當的地方,歡迎批評指正!
更詳細的分析,可以參考“碼到”的博文:
https://blog.csdn.net/qq_39056197/article/details/102598674

總結

以上是生活随笔為你收集整理的Java动态代理invoke方法自动执行的原因的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。