您好,登錄后才能下訂單哦!
本篇內容介紹了“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調用次數不正常是什么情況”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。