频 道 直 达 - 新闻 - 读书 - 培训 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 技术圈 - 博客 - BBS
51CTO.COM_中国领先的IT技术网站
找资料:

了解JAVA classloader(2)

作者: 出处:赛迪网社区  (  ) 砖  (  ) 好  评论 ( ) 条  进入论坛
更新时间:2006-11-21 09:59
关 键 词:JAVA  classloader  
阅读提示:与C或C++编写的程序不同,Java程序并不是一个可执行文件,而是由许多独立的类文件组成,每一个文件对应于一个Java类。ClassLoader是JVM中将类装入内存的那部分。而且,Java ClassLoader就是用Java语言编写的。这意味着创建您自己的ClassLoader非常容易,不必了解JVM的微小细节。

方法defineClass

defineClass方法是ClassLoader的主要诀窍。该方法接受由原始字节组成的数组并把它转换成Class对象。原始数组包含如从文件系统或网络装入的数据。

defineClass管理JVM的许多复杂、神秘和倚赖于实现的方面--它把字节码分析成运行时数据结构、校验有效性等等。不必担心,您无需亲自编写它。事实上,即使您想要这么做也不能覆盖它,因为它已被标记成最终的。

方法findSystemClass

findSystemClass方法从本地文件系统装入文件。它在本地文件系统中寻找类文件,如果存在,就使用defineClass将原始字节转换成Class对象,以将该文件转换成类。当运行Java应用程序时,这是JVM正常装入类的缺省机制。(Java 2中ClassLoader的变动提供了关于Java版本1.2这个过程变动的详细信息。)

对于定制的ClassLoader,只有在尝试其它方法装入类之后,再使用findSystemClass。原因很简单:ClassLoader是负责执行装入类的特殊步骤,不是负责所有类。例如,即使ClassLoader从远程的Web站点装入了某些类,仍然需要在本地机器上装入大量的基本Java库。而这些类不是我们所关心的,所以要JVM以缺省方式装入它们:从本地文件系统。这就是findSystemClass的用途。

其工作流程如下:

1、请求定制的ClassLoader装入类。
2、检查远程Web站点,查看是否有所需要的类。
3、如果有,那么好;抓取这个类,完成任务。
4、如果没有,假定这个类是在基本Java库中,那么调用findSystemClass,使它从文件系统装入该类。

在大多数定制ClassLoaders中,首先调用findSystemClass以节省在本地就可以装入的许多Java库类而要在远程Web站点上查找所花的时间。然而,正如,在下一章节所看到的,直到确信能自动编译我们的应用程序代码时,才让JVM从本地文件系统装入类。

方法resolveClass

正如前面所提到的,可以不完全地(不带解析)装入类,也可以完全地(带解析)装入类。当编写我们自己的loadClass时,可以调用resolveClass,这取决于loadClass的resolve参数的值。

方法findLoadedClass

findLoadedClass充当一个缓存:当请求loadClass装入类时,它调用该方法来查看ClassLoader是否已装入这个类,这样可以避免重新装入已存在类所造成的麻烦。应首先调用该方法。

组装

让我们看一下如何组装所有方法。

我们的loadClass实现示例执行以下步骤。(这里,我们没有指定生成类文件是采用了哪种技术--它可以是从Net上装入、或者从归档文件中提取、或者实时编译。无论是哪一种,那是种特殊的神奇方式,使我们获得了原始类文件字节。)

CCL揭密

我们的ClassLoader(CCL)的任务是确保代码被编译和更新。

下面描述了它的工作方式:

1、当请求一个类时,先查看它是否在磁盘的当前目录或相应的子目录。
2、如果该类不存在,但源码中有,那么调用Java编译器来生成类文件。
3、如果该类已存在,检查它是否比源码旧。如果是,调用Java编译器来重新生成类文件。
4、如果编译失败,或者由于其它原因不能从现有的源码中生成类文件,返回ClassNotFoundException。
5、如果仍然没有该类,也许它在其它库中,所以调用findSystemClass来寻找该类。
6、如果还是没有,则返回ClassNotFoundException。
7、否则,返回该类。
8、调用findLoadedClass来查看是否存在已装入的类。
9、如果没有,那么采用那种特殊的神奇方式来获取原始字节。
10、如果已有原始字节,调用defineClass将它们转换成Class对象。
11、如果没有原始字节,然后调用findSystemClass查看是否从本地文件系统获取类。
12、如果resolve参数是true,那么调用resolveClass解析Class对象。
13、如果还没有类,返回ClassNotFoundException。
14、否则,将类返回给调用程序。

Java编译的工作方式

在深入讨论之前,应该先退一步,讨论Java编译。通常,Java编译器不只是编译您要求它编译的类。

它还会编译其它类,如果这些类是您要求编译的类所需要的类。

CCL逐个编译应用程序中的需要编译的每一个类。但一般来说,在编译器编译完第一个类后,CCL会查找所有需要编译的类,然后编译它。为什么?Java编译器类似于我们正在使用的规则:如果类不存在,或者与它的源码相比,它比较旧,那么它需要编译。其实,Java编译器在CCL之前的一个步骤,它会做大部分的工作。

当CCL编译它们时,会报告它正在编译哪个应用程序上的类。在大多数的情况下,CCL会在程序中的主类上调用编译器,它会做完所有要做的--编译器的单一调用已足够了。

然而,有一种情形,在第一步时不会编译某些类。如果使用Class.forName方法,通过名称来装入类,Java编译器会不知道这个类时所需要的。在这种情况下,您会看到CCL再次运行Java编译器来编译这个类。在源代码中演示了这个过程。


共3页: 上一页 [1] 2 [3] 下一页
【内容导航】
发表
查看
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 领 先 的 IT 技 术 网 站 ·
技 术 成 就 梦 想
·Java基础教程 (查看52371次)
·UML类图详解 (查看46839次)
·Java编程开发手册 (查看25118次)
·UML统一建模语言 (查看24099次)
·C#技术开发指南 (查看22406次)
·Java编程开发手册 (1195个砖)
·Java基础教程 (429个砖)
·C#技术开发指南 (304个砖)
·PB开发教程 (220个砖)
·.NET开发手册 (217个砖)
·Java编程开发手册 (653个好)
·Java基础教程 (569个好)
·.NET开发手册 (251个好)
·PB开发教程 (209个好)
·Delphi开发技术手册 (174个好)
订阅技术快讯
电子杂志下载
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
名称:Vista精品应用黄皮书
简介:《Vista精品应用黄皮书》囊括了Vista的各方面内容。此次的精简版,是将里面的内容做了提取,便于用户下载和使用。内容包含了各种Vista的安装与实施、技巧与解析以及各种Vista相关学习文档和相关软件的安全下载。该电子书是了解和应用Vista人员必备的工具手册,并且也是第一本
名称:2006中国IT论坛精品集合
简介:本书由“51CTO论坛推广联盟”制作完成。书中所有内容均来自各联盟成员的论坛(网站)。制作本书的目的是为了集中大家的优势资源,将更多更精彩的内容带给广大技术爱好者。本书是联盟成立以来制作的第一本书。
关键字阅读
频道精选
主编信箱 热线:010-66476606 告诉我们您想看的:专题 文章
关于我们 | 诚聘英才 | 联系我们 | 网站大事 | 意见反馈 | 网站地图
Copyright©2005-2007 51CTO.COM 版权所有