background image

Class loadClass(String name, boolean resolve);

name 参数指定了 JVM 需要的类的名称,该名称以包表示法表示,如
Foo 或 java.lang.Object。

resolve 参数告诉方法是否需要解析类。在准备执行类之前,应考虑类
解析。并不总是需要解析。如果 JVM 只需要知道该类是否存在或找出该
类的超类,那么就不需要解析。

在 Java 版本 1.1 和以前的版本中,loadClass 方法是创建定制的
ClassLoader 时唯一需要覆盖的方法。(Java 2 中 ClassLoader 的变动
提供了关于 Java 1.2 中 findClass()方法的信息。)

方法 defineClass

defineClass 方法是 ClassLoader 的主要诀窍。该方法接受由原始字节组成的
数组并把它转换成 Class 对象。原始数组包含如从文件系统或网络装入的数据。

defineClass 管理 JVM 的许多复杂、神秘和倚赖于实现的方面--它把字节码分
析成运行时数据结构、校验有效性等等。不必担心,您无需亲自编写它。事实上,
即使您想要这么做也不能覆盖它,

因为它已被标记成最终的

方法 findSystemClass 

findSystemClass 方法从

本地文件系

统装入文件。它在本地文件系统中寻找类

文件,如果存在,就使用 defineClass

 

将原始字节转 换成 Class 对象,以将

该文件转换成类。当运行 Java 应用程序时,这是 JVM 正常装入类的缺省机制。
(Java 2 中 ClassLoader 的变动提供了关于 Java 版本 1.2 这个过程变动的详
细信息。)

对于定制的 ClassLoader,只有在尝试其它方法装入类之后,再使用
findSystemClass。原因很简单:ClassLoader

 

是 负责执行装入类的特殊步骤,

不是负责所有类。例如,即使 ClassLoader 从远程的 Web 站点装入了某些类,

 

仍然需要在本地机器上装入大量的基本 Java 库。而这些类不是我们所关心的,
所以要 JVM 以缺省方式装入它们:从本地文件系统。这就是 findSystemClass
的用途。

其工作流程如下:

1、请求定制的 ClassLoader 装入类。
2、检查远程 Web 站点,查看是否有所需要的类。
3、如果有,那么好;抓取这个类,完成任务。
4、如果没有,假定这个类是在基本 Java 库中,那么调用 findSystemClass,
使它从文件系统装入该类。