快速业务通道

深入探讨Java类加载器 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的 。系统提供的类加载器主要有下面三个:

引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继 承自 java.lang.ClassLoader。

扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库 目录。该类加载器在此目录里面查找并加载 Java 类。

系统类加载器 (system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader() 来获取它。

除了系统提供的类加 载器以外,开发人员可以通过继承 java.lang.ClassLoader 类的方式实现自己 的类加载器,以满足一些特殊的需求。

除了引导类加载器之外,所有的 类加载器都有一个父类加载器。通过 表 1 中给出的 getParent() 方法可以得 到。对于系统提供的类加载器来说,系统类加载器的父类加载器是扩展类加载器 ,而扩展类加载器的父类加载器是引导类加载器;对于开发人员编写的类加载器 来说,其父类加载器是加载此类加载器 Java 类的类加载器。因为类加载器 Java 类如同其它的 Java 类一样,也是要由类加载器来加载的。一般来说,开 发人员编写的类加载器的父类加载器是系统类加载器。类加载器通过这种方式组 织起来,形成树状结构。树的根节点就是引导类加载器。图 1 中给出了一个典 型的类加载器树状组织结构示意图,其中的箭头指向的是父类加载器。

图 1. 类加载器树状组织结构示意图

深入探讨Java类加载器(3)

时间:2011-06-12 IBM 成富

代码清单 1 演示了类加载器的树状组织结构。

清单 1. 演示类加载 器的树状组织结构

public class ClassLoaderTree {   public static void main(String[] args) {      ClassLoader loader = ClassLoaderTree.class.getClassLoader();     while (loader != null) {        System.out.println(loader.toString());       loader =  loader.getParent();     }   } }

每个 Java 类都维护着一个指向定义它的类加载器的引用,通过 getClassLoader() 方法就可以获取到此引用。代码清单 1 中通过递归调用 getParent() 方法来输 出全部的父类加载器。代码清单 1 的运行结果如 代码清单 2 所示。

清 单 2. 演示类加载器的树状组织结构的运行结果

sun.misc.Launcher$AppClassLoader@9304b1 sun.misc.Launcher$ExtClassLoader@190d11

如 代码清单 2 所示,第一个输出的是 ClassLoaderTree 类的类加载器,即系统类加载器。它 是 sun.misc.Launcher$AppClassLoader 类的实例;第二个输出的是扩展类加载 器,是 sun.misc.Launcher$ExtClassLoader 类的实例。需要注意的是这里并没 有输出引导类加载器,这是由于有些 JDK 的实现对于父类加载器是引导类加载 器的情况,getParent() 方法返回 null。

在了解了类加载器的树状组织 结构之后,下面介绍类加载器的代理模式。

类加载器的代理模式

类加载器在尝试自己去查找某个类的字节代码并定义它时,会先代理给其父类加 载器,由父类加载器先去尝试加载这个类,依次类推。在介绍代理模式背后的动 机之前,首先需要说明一下 Java 虚拟机是如何判定两个 Java 类是相同的。 Java 虚拟机不仅要看类的全名是否相同,还要看加载此类的类加载器是否一样 。只有两者都相同的情况,才认为两个类是相同的。即便是同样的字节代码,被 不同的类加载器加载之后所得到的类,也是不同的。比如一个 Java 类 com.example.Sample,编译之后生成了字节代码文件 Sample.class。两个不同 的类加

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号