Jhonney的专栏

   ----人见人爱
随笔 - 49, 文章 - 1, 评论 - 23, 引用 - 0
数据加载中……

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

posted on 2008-03-23 00:19 Jhonney 阅读(362) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: