記錄一次由classloader引發的坑
阿新 • • 發佈:2021-01-19
技術標籤: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) {
}
然後就報錯
java.lang.IllegalArgumentException: Class xxxA is not assignable to factory type Class xxxB
附上debug兩個類由不同的classloader載入截圖,一個是Launcher一個是RestartClassLoader