快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
至少需要 引用 java.lang.Object 类,也就是说在运行的时候,java.lang.Object 这个 类需要被加载到 Java 虚拟机中。如果这个加载过程由 Java 应用自己的类加载 器来完成的话,很可能就存在多个版本的 java.lang.Object 类,而且这些类之 间是不兼容的。通过代理模式,对于 Java 核心库的类的加载工作由引导类加载 器来统一完成,保证了 Java 应用所使用的都是同一个版本的 Java 核心库的类 ,是互相兼容的。

不同的类加载器为相同名称的类创建了额外的名称空 间。相同名称的类可以并存在 Java 虚拟机中,只需要用不同的类加载器来加载 它们即可。不同类加载器加载的类之间是不兼容的,这就相当于在 Java 虚拟机 内部创建了一个个相互隔离的 Java 类空间。这种技术在许多框架中都被用到, 后面会详细介绍。

下面具体介绍类加载器加载类的详细过程。

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

时间:2011-06-12 IBM 成富

加 载类的过程

在前面介绍类加载器的代理模式的时候,提到过类加载器会 首先代理给其它类加载器来尝试加载某个类。这就意味着真正完成类的加载工作 的类加载器和启动这个加载过程的类加载器,有可能不是同一个。真正完成类的 加载工作是通过调用 defineClass 来实现的;而启动类的加载过程是通过调用 loadClass 来实现的。前者称为一个类的定义加载器(defining loader),后 者称为初始加载器(initiating loader)。在 Java 虚拟机判断两个类是否相 同的时候,使用的是类的定义加载器。也就是说,哪个类加载器启动类的加载过 程并不重要,重要的是最终定义这个类的加载器。两种类加载器的关联之处在于 :一个类的定义加载器是它引用的其它类的初始加载器。如类 com.example.Outer 引用了类 com.example.Inner,则由类 com.example.Outer 的定义加载器负责启动类 com.example.Inner 的加载过程。

方法 loadClass() 抛出的是 java.lang.ClassNotFoundException 异常;方法 defineClass() 抛出的是 java.lang.NoClassDefFoundError 异常。

类 加载器在成功加载某个类之后,会把得到的 java.lang.Class 类的实例缓存起 来。下次再请求加载该类的时候,类加载器会直接使用缓存的类的实例,而不会 尝试再次加载。也就是说,对于一个类加载器实例来说,相同全名的类只加载一 次,即 loadClass 方法不会被重复调用。

下面讨论另外一种类加载器: 线程上下文类加载器。

线程上下文类加载器

线程上下文类加载器 (context class loader)是从 JDK 1.2 开始引入的。类 java.lang.Thread 中的方法 getContextClassLoader() 和 setContextClassLoader(ClassLoader cl) 用来获取和设置线程的上下文类加载器。如果没有通过 setContextClassLoader(ClassLoader cl) 方法进行设置的话,线程将继承其父 线程的上下文类加载器。Java 应用运行的初始线程的上下文类加载器是系统类 加载器。在线程中运行的代码可以通过此类加载器来加载类和资源。

前 面提到的类加载器的代理模式并不能解决 Java 应用开发中会遇到的类加载器的 全部问题。Java 提供了很多服务提供者接口(Service Provider Interface, SPI),允许第三方为这些接口提供实现。常见的 SPI 有 JDBC、JCE、JNDI、 JAXP 和 JBI 等。这些 SPI 的接口由 Java 核心库来提供,如 JAXP 的 SPI 接 口定义包含在 javax.xml.parsers 包中。这些 SPI 的实现代码很可能是作为 Java 应用所依赖的 jar 包被包含进来,可以通过类路径(CLASSPATH)来找到 ,如实现了 JAXP SPI 的 Apache Xerces 所包含的 jar 包。SPI 接口中的代码 经常需要加载具体的实现类。如 JAXP 中的 javax.xml.parsers.DocumentBuilderFactory 类中的 newInstance() 方法用来 生成一个新的 DocumentBuilderFact

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号