| | 网站首页 | 政策法规 | 天文航天 | 地理人文 | 文学历史 | 科学生活 | 信息军事 | 卫生保健 | 奇妙自然 | 留言 | | |
![]() |
|
| 您现在的位置: 活到老学到老 >> 信息军事 >> 数据编程 >> 正文 |
|
|||||
| ClassLoader介绍 | |||||
作者:未知 文章来源:转载 点击数: 更新时间:2006-2-28 ![]() |
|||||
|
【IT168 编程开发】JVM在运行时会产生三个ClassLoader,Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader.其中,Bootstrap是用C++编写的,我们在Java中看不到它,是null。它用来加载核心类库,在JVM源代码中这样写道: static const char classpathFormat[] = Extension ClassLoader用来加载扩展类,即/lib/ext中的类。 最后AppClassLoader才是加载Classpath的。 ClassLoader加载类用的是委托模型。即先让Parent类(而不是Super,不是继承关系)寻找,Parent找不到才自己找。看来ClassLoader还是蛮孝顺的。三者的关系为:AppClassLoader的Parent是ExtClassLoader,而ExtClassLoader的Parent为Bootstrap ClassLoader。加载一个类时,首先BootStrap先进行寻找,找不到再由ExtClassLoader寻找,最后才是AppClassLoader。 为什么要设计的这么复杂呢?其中一个重要原因就是安全性。比如在Applet中,如果编写了一个java.lang.String类并具有破坏性。假如不采用这种委托机制,就会将这个具有破坏性的String加载到了用户机器上,导致破坏用户安全。但采用这种委托机制则不会出现这种情况。因为要加载java.lang.String类时,系统最终会由Bootstrap进行加载,这个具有破坏性的String永远没有机会加载。 我们来看这段代码: //A.java sun.misc.Launcher$AppClassLoader@92e78c 2、我们将其放在%jre%/lib/ext/classes(即ExtClassLoader的加载目录。其加载/lib/ext中的jar文件或者子目录classes中的class文件)中。则会打印出: sun.misc.Launcher$ExtClassLoader sun.misc.Launcher$ExtClassLoader 怎么会这样呢?这其中有一个重要的问题:A类当然是由ExtClassLoader来加载的,B类要由哪个加载呢?B类要由调用它自己的类的类加载器(真拗口)。也就是说,A调用了B,所以B由A的类加载器ExtClassLoader来加载。ExtClassLoader根据委托机制,先拜托Bootstrap加载,Bootstrap没有找到。然后它再自己寻找B类,还是没找到,所以抛出异常。ExtClassLoader不会请求AppClassLoader来加载!你可能会想:这算什么问题,我把两个类放到一起不就行了? 呵呵,没这么简单。比如JDBC是核心类库,而各个数据库的JDBC驱动则是扩展类库或在classpath中定义的。所以JDBC由Bootstrap ClassLoader加载,而驱动要由AppClassLoader加载。等等,问题来了,Bootstrap不会请求AppClassLoader加载类啊。那么,他们怎么实现的呢?我就涉及到一个Context ClassLoader的问题,调用Thread.getContextClassLoader。具体我还没搞太明白,要知后事如何,请听下回分解!(啊!别拿砖头砸我...) |
|||||
| 文章录入:wswys 责任编辑:wswys | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| 双击无法打开硬盘 双击打不开… 无法显示隐藏文件解决方法 Ping同一个域名得到不同IP是… 为何本地网卡会收发异常 如何下载网上的Flash动画 怎么用IE快速访问FTP站点 局域网内复制文件出错怎么办 如何限制外网访问内网 网络已通收发数据为何为零? 为何点击超链接没有反应 |
网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | | |
![]() |
『活到老学到老』 版权所有
|