先介绍下背景:
环境是是web环境,tomcat7.x,项目中需要使用外部一个sdk(一个jar包)作为client去访问外部server做认证,sdk提供了配置propery来指定一个连接server用的
class,这个class需要实现包中XXXHelper
接口。包中用一个xxxProvider.class来反射创建配置class对象。
但是包中使用的是class.ForName("package.className"),每次都报ClassNotFoundException。
解决办法1 只有放在这个jar包中才可以
解决办法2
后来反编译替换
创建对象的xxxProvider, 将class.ForName换成下面的就好了。
Thread.currentThread().getContextClassLoader().loadClass($YOUR_CLASS_NAME)
这种情况需要和提供sdk的团队沟通去修改。
通过对比加载实例所用的classLoader和xxxProvider的classLoader
发现,创建实例成功的是使用WebappClassLoader(Thread.currentThread().getContextClassLoader())而xxxProvider使用的是StandardClassLoader, WebappClassLoader是StandardClassLoader子加载器,根据类加载机制,StandardClassLoader不能加载这个类。