1. 程式人生 > 其它 >記錄一次由classloader引發的坑

記錄一次由classloader引發的坑

技術標籤:java

問題描述:簡單來說就是如果父類和子類的classloader不一樣,isAssignableFrom方法就會失效(明明classA實現了interfaceB,但是B.isAssignableFrom(A.class)一直為false)

解決方法:保證A,B用同一個classloader

ClassLoader classLoader = B.class.getClassLoader();
Class<?> AClass = ClassUtils.forName(AName,classLoader);
Class<B> BClass = B.class
; System.out.println(B.isAssignableFrom(A));

詳細掉坑過程(方便引流,幫到和我遇到一樣奇葩問題,然後搜了半天沒有解決方案的小夥伴)
出bug程式碼段:使用spring.factories裝載bean(用一個介面多個實現類的方式,實現bean工廠),
然後用SpringFactoriesLoader.loadFactories把bean存入map,這一步裡就有上述isAssignableFrom問題

loadFactories方法需要傳兩個引數,一個是介面類,一個就是classloader,當時直接傳了null,用系統預設的classloader
if (classLoaderToUse == null) {

classLoaderToUse = SpringFactoriesLoader.class.getClassLoader();
}
然後就報錯
java.lang.IllegalArgumentException: Class xxxA is not assignable to factory type Class xxxB

附上debug兩個類由不同的classloader載入截圖,一個是Launcher一個是RestartClassLoader
在這裡插入圖片描述
在這裡插入圖片描述