记录一次由classloader引发的坑

本文描述了一个关于父类和子类使用不同ClassLoader导致isAssignableFrom方法失效的问题,并提供了解决方案,即确保两个类使用相同的ClassLoader。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:简单来说就是如果父类和子类的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
在这里插入图片描述
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值