深入探讨Java类加载器 - 编程入门网
成两类,一类是系统提供的,另外一类则是由 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. 演示类加载 器的树状组织结构
每个 Java 类都维护着一个指向定义它的类加载器的引用,通过 getClassLoader() 方法就可以获取到此引用。代码清单 1 中通过递归调用 getParent() 方法来输 出全部的父类加载器。代码清单 1 的运行结果如 代码清单 2 所示。 清 单 2. 演示类加载器的树状组织结构的运行结果
如 代码清单 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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |