类加载器的结构



类加载器在安全性和网络移动性上起着重要作用,一个java虚拟机中可以包含多个类加载器,这些类加载器组成了类加载器子系统。



Java应用程序可以使用两种类型的类加载器:


  • 一个bootstrap类加载器
  • user-defined类加载器



bootstrap类加载器是Java虚拟机实现的一部分,它通常从本地磁盘中以某种默认的方式加载class文件,包括Java API的class文件。



在运行时,java程序可以安装user-defined类加载器,以自定义的方式来加载class文件,例如从网络中下载class文件。与bootstrap类加载器不同,user-defined类加载器不属于java虚拟机实现的一部分。user-defined类加载器用java语言编写,编译成class文件,加载到虚拟机中,并像其他对象一样被实例化。它只是java程序执行代码的一部分。下图描述了这种架构:




java部门树父子排序_java




user-defined类加载器使你能够在运行时动态扩展java程序。随着程序的运行,你的程序可以决定它需要哪些额外的class,并通过一个或多个user-defined类加载器加载它们。因为user-defined类加载器使用java语言编写,你可以使用任何java语言可以表达的方式加载class文件,例如从网上下载,从数据库获取等。



java虚拟机加载的每一个类所用的类加载器会被记录起来。当一个被加载的class第一次引用另一个class时,java虚拟机会从引用class所用的类加载器中请求被引用class。



class默认只能看到通过相同类加载器加载的class。用这种方式,java使你能够在单个程序中创建多个name-space。程序中的每个类加载器有它专有的name-space,里面放着它加载的所有class的名字。



被不同类加载器加载的class在不同的name-space里,并且无法相互访问,除非程序显示地允许这个行为。用不同的user-defined类加载器加载从不同源获取的class文件,把它们放到不同的name-space里,这样在程序中你就可以防止有害代码的访问,从而保证了程序的安全性。



class文件



class文件主要在两方面上使java适用于网络:


  • 平台无关性
  • 网络移动性

平台无关性主要体现在为java程序提供了虚拟机所期待的与平台无关的二进制文件格式。这种方法打破了c,c++等语言所遵循的惯例,用这些语言写的程序常常会被编译并连接成单个与特定硬件平台和操作系统相关的二进制可执行文件。一般地,一个平台的二进制可执行文件无法在另一个平台中运行。相比之下,java的class文件可以运行在任何含有java虚拟机的硬件平台和操作系统之上。



当你编译并连接一个c++程序时,你所得到的二进制可执行文件是特定于具体目标硬件平台和操作系统的,因为它包含目标处理器指定的机器语言。相比之下,java编译器将java源代码翻译成字节码,相当于java虚拟机的机器码。



除了支持平台无关性,class文件在网络移动性方面也起到了重要的作用。首先,calss文件的内容排列是很紧凑的,所以可以在网络间快速移动它们。另外,因为java程序是动态链接并且可动态扩展,class文件可以在需要时才下载。