问题描述:简单来说就是如果父类和子类的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