java.lang.IllegalArgumentException: object is not an instance of declaring class新發現

文章目錄

背景

由於要將方法緩存起來提升性能java

報錯

java.lang.IllegalArgumentException: object is not an instance of declaring class

解決

以前個人一篇文章:
https://blog.csdn.net/dataiyangu/article/details/88370206
說的是由於第一次構造出Method的類,和真正執行的時候的對象的類不是同一的。web

通過此次發現:這個錯誤還和ClassLoader有關係,若是ClassLoader不相同,也會報這個錯誤。緩存

log.debug("req###########################################+" + req.getClass().getClassLoader().toString());

在這裏插入圖片描述
在這裏插入圖片描述
能夠看到兩個request的context是不一樣的。svg

因此會報如上的錯誤。性能

引伸

固然,解決的辦法就是將
classLoader的hashCode+className+methodName 做爲key緩存到HashMap中,spa

這個時候可能會報錯空指針
由於,有些基礎的類確實得不到ClassLoader,而在個人實際狀況中,這些類(真的是得不到ClassLoader的狀況)不會出現二次訪問的狀況,因此不須要訪問,因此作以下處理便可。.net

ClassLoader classLoader = object.getClass().getClassLoader();
		if (classLoader != null) {
			int classLoaderHash = classLoader.toString().hashCode();
			 methodId = classLoaderHash+className + methodName;
		}else{
			 methodId = className + methodName;
		}
相關文章
相關標籤/搜索