classloader 和class.forname的区别
项目中,发生了classcast异常,源码处写的是Thread.currentThread
.getContextClassLoader
后来改成class.forname后OK啦
Class.forName(String clz);
使用调用这个语句的对象所使用的ClassLoader作为ClassLoader(1)。
Thread.currentThread().getContextClassLoader())
返回当前线程使用的ClassLoader(2)。
如果ClassLoader(1)“等于”ClassLoader(2),那么这里的使用Class.forName(String clz)和ClassLoader(2).loadClass(String clz)就是等价的。
如果ClassLoader(1)“不等于”ClassLoader(2),那么就是不等价的。
在框架代码中,实际情况是ClassLoader(1)往往“不等于”ClassLoader(2):
即调用Class.forName(String clz)的语句所在的类的装载器不一定就是当前线程使用的类装载器。
因为:一个类装载完了在运行了,该类的所属的类装载器就确定了(不变),而在程序运行之中,线程
的类装载器都随时可以通过hread.currentThread().setContextClassLoader(loader)进行改变(变)。
程序中出现的错误,可能是由于平台的classloader是另一套机制