免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

InvocationHandler的invoke調用次數不正常是什么情況

本篇內容介紹了“InvocationHandler的invoke調用次數不正常是什么情況”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

創新互聯建站是一家專注于網站制作、成都網站設計和樂山服務器托管的網絡公司,有著豐富的建站經驗和案例。

大概意思就是:同一份動態代碼實驗代碼,放在Eclipse中測試一切正常,但放在IDEA 中的springboot項目中測試時就不正常。

動態代理實驗,一個接口:

public interface DestInterface {
    void fun(String msg);
}

這個接口的實現類:

public class DestClass implements DestInterface {
    public void fun(String msg) {
        System.out.println("DestClass.fun "+ msg);
    }
}
一個InvocationHandler接口的實現類:

public class DynamicProxy implements InvocationHandler {
    private Object object;//要代理的真正對象
    public DynamicProxy(Object obj) //構造并傳遞真正的對象
    {
        object = obj;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before proxy proxy class is " + proxy.getClass());
        System.out.println("method is " + method + ":"+method.getName() + ":"+ method.getDeclaringClass() + ":"+ method.getReturnType());
//        Object obj =  method.invoke(object,args); //出現 IllegalArgumentException: object is not an instance of declaring class
//        Object obj  = method.invoke(proxy,args); //總是不停地執行,不明白為什么會這樣
        Object obj =  method.invoke(object,args);//出現類不匹配的原因是:主程序中InvocationHandler invocationHandler = new DynamicProxy(someservice);
        //其實在InvocationHandler實例化對象的時候,傳入的是真正的要在其上執行函數的對象,這個對象所在類應該繼承了一個或多個接口,當然這些接口在Proxy.newInstance
        // 創建代理對象的時候將這些接口的Class傳入。也就是說new InvocationHandler對象的時候參數應該是目標類的對象,此例是DestInterface的實現類的對象
        System.out.println("after proxy vaue="+obj);

        return null;
    }
}
具體要想使用動態代理對象的代碼如下:

DestInterface destInterface = new DestClass();//真正的目標對象
InvocationHandler invocationHandler = new DynamicProxy(destInterface);
DestInterface o =  
(DestInterface)Proxy.newProxyInstance(invocationHandler.getClass().getClassLoader(),destInterface.getClass().getInterfaces(),invocationHandler);

o.fun("abc");

在Eclipse中顯示如下:

before proxy proxy class is class com.sun.proxy.$Proxy0
method is public abstract void com.joe.DestInterface.fun(java.lang.String):fun:interface com.joe.DestInterface:void
DestClass.fun abc
after proxy vaue=null

但在IDEA的springboot項目中顯示如下:

before proxy proxy class is class com.sun.proxy.$Proxy41
method is public java.lang.String java.lang.Object.toString():toString:class java.lang.Object:class java.lang.String
after proxy vaue=com.joe.DestClass@1e53135d
before proxy proxy class is class com.sun.proxy.$Proxy41
method is public abstract void com.joe.DestInterface.fun(java.lang.String):fun:interface com.joe.DestInterface:void
DestClass.fun himsg
after proxy vaue=null
before proxy proxy class is class com.sun.proxy.$Proxy41
method is public java.lang.String java.lang.Object.toString():toString:class java.lang.Object:class java.lang.String
after proxy vaue=com.joe.DestClass@1e53135d

在IDEA中調試時發現當執行完Proxy.newInstance這一句之后居然發現會進入DymicProxy.invoke中執行代碼,明顯感覺不正常,但又不知道原因???

2021/5/11再次調試發現:

只要在IDEA中設置斷點,比如在o.fun之后設置斷點,也會出現次數不正常現象,但如果不設置斷點直接跑則一切正常。這種現象真的很奇怪,原因不明。

在Eclipse中設不設斷點一切現象都是正常的。

“InvocationHandler的invoke調用次數不正常是什么情況”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注創新互聯網站,小編將為大家輸出更多高質量的實用文章!

網頁標題:InvocationHandler的invoke調用次數不正常是什么情況
網頁地址:http://newbst.com/article16/jhesdg.html

成都網站建設公司_創新互聯,為您提供網站維護網站制作全網營銷推廣響應式網站建站公司虛擬主機

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都seo排名網站優化