没有合适的资源?快使用搜索试试~ 我知道了~
类加载器(class loader)是 Java™ 中的一个很重要的概念。类加载器负责加载 Java 类的字节代码到 Java 虚拟机中。本文首先详细介绍了 Java 类加载器的基本概念,包括代理模式、加载类的具体过程和线程上下文类加载器等,接着介绍如何开发自己的类加载器,最后介绍了类加载器在 Web 容器和 OSGi™ 中的应用。
资源推荐
资源详情
资源评论
深入探讨 Java 类加载器
简介: 类加载器(class loader)是 Java™ 中的一个很重要的概念。类加载器负责加载 Java
类的字节代码到 Java 虚拟机中。本文首先详细介绍了 Java 类加载器的基本概念,包括代
理模式、加载类的具体过程和线程上下文类加载器等,接着介绍如何开发自己的类加载器
最后介绍了类加载器在 Web 容器和 OSGi™ 中的应用。
类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可
以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足
Java Applet 的需要而开发出来的。Java Applet 需要从远程下载 Java 类文件到浏览器中并执
行。现在类加载器在 Web 容器和 OSGi 中得到了广泛的使用。一般来说,Java 应用的开发
人员不需要直接同类加载器进行交互。Java 虚拟机默认的行为就已经足够满足大多数情况
的需求了。不过如果遇到了需要与类加载器进行交互的情况,而对类加载器的机制又不是
很 了 解 的 话 , 就 很 容 易 花 大 量 的 时 间 去 调 试 ClassNotFoundException 和
NoClassDefFoundError 等异常。本文将详细介绍 Java 的类加载器,帮助读者深刻理解 Java
语言中的这个重要概念。下面首先介绍一些相关的基本概念。
类加载器基本概念
顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚
拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被
转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成
java.lang.Class 类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的
newInstance()方法就可以创建出该类的一个对象。实际的情况可能更加复杂,比如 Java 字
节代码可能是通过工具动态生成的,也可能是通过网络下载的。
基本上所有的类加载器都是 java.lang.ClassLoader 类的一个实例。下面详细介绍这个 Java
类。
java.lang.ClassLoader 类介绍
java.lang.ClassLoader 类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的
字节代码,然后从这些字节代码中定义出一个 Java 类,即 java.lang.Class 类的一个实例。
除此之外,ClassLoader 还负责加载 Java 应用所需的资源,如图像文件和配置文件等。不过
本文只讨论其加载类的功能。为了完成加载类的这个职责,ClassLoader 提供了一系列的方
法,比较重要的方法如 表 1 所示。关于这些方法的细节会在下面进行介绍。
表 1. ClassLoader 中与加载类相关的方法
方法 说明
getParent()
返回该类加载器的父类加载器。
loadClass(String name)
加载名称为 name 的类,返回的结果是 java.lang.Class 类的实
例。
findClass(String name)
查找名称为 name 的类,返回的结果是 java.lang.Class 类的实
例。
findLoadedClass(String name)
查 找 名 称 为 name 的 已 经 被 加 载 过 的 类 , 返 回 的 结 果 是
java.lang.Class 类的实例。
defineClass(String name, byte[] b,
int off, int len)
把 字 节 数 组 b 中 的 内 容 转 换 成 Java 类 , 返 回 的 结 果 是
java.lang.Class 类的实例。这个方法被声明为 final 的。
resolveClass(Class<?> c)
链接指定的 Java 类。
对于 表 1 中给出的方法,表示类名称的 name 参数的值是类的二进制名称。需要注意的是
内部类的表示,如 com.example.Sample$1 和 com.example.Sample$Inner 等表示方式。这些
方法会在下面介绍类加载器的工作机制时,做进一步的说明。下面介绍类加载器的树状组
织结构。
类加载器的树状组织结构
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 中给出了一个典型的类加载器树状组织结构示意图,其中的
箭头指向的是父类加载器。
剩余12页未读,继续阅读
资源评论
sky3380
- 粉丝: 3
- 资源: 33
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功