classloader

classloader

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是另一套机制


你可能感兴趣的:(classloader)