中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-06-26 09:17:03 來源:億速云 閱讀:236 作者:chen 欄目:編程語言

本篇內容介紹了“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調用次數不正常是什么情況”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

星子县| 垫江县| 德惠市| 尖扎县| 布尔津县| 玉树县| 鞍山市| 南投县| 波密县| 东方市| 宜昌市| 南安市| 塘沽区| 遂溪县| 张北县| 大足县| 三河市| 琼海市| 历史| 盐边县| 睢宁县| 长宁县| 阿拉善盟| 尼木县| 手游| 昆明市| 南投市| 永吉县| 九寨沟县| 迁安市| 五河县| 孝感市| 保亭| 巫溪县| 聊城市| 襄樊市| 蒲江县| 富锦市| 东辽县| 洛宁县| 房山区|