JVM 角度

在 JVM 角度只存在两种不同的类加载器

  • 启动类加载器(Bootstrap ClassLoader),C++ 实现(Hotspot)
  • 其他类加载器,Java 语言实现,独立于 JVM ,继承子 java.lang.ClassLoader,这些类加载器需要启动类加载器加载到内存之后才能去加载其他类

开发人员角度

JVM 中有三个必须要知道的 ClassLoader 类加载器:

  • Bootstrap ClassLoader 启动类加载器,从 JDK 1.2 起被加入到 JVM 中,负责加载JDK核心类库,rt.jar, resources.jar, charsets.jar
    • 启动类加载器无法被 Java 程序直接引用
  • Extension ClassLoader 扩展类加载器,默认加载 JAVA_HOME/jre/lib/ext/ 目录下所有 jar
    • 开发者可以直接使用扩展类加载器
  • Application ClassLoader 或者叫做 System ClassLoader 系统类加载器,应用程序 classpath 下所有 jar 和 class 文件
    • 负责加载用户 ClassPath 指定的类

应用程序都是这三类加载器互相配合进行。

JDK 内置了一个 URLClassLoader 用来加载网络上的静态文件服务器提供的 jar 包和 class文件,用户只需要传递规范的网络路径给构造器,就可以使用 URLClassLoader 来加载远程类库了。URLClassLoader 不但可以加载远程类库,还可以加载本地路径的类库,取决于构造器中不同的地址形式。ExtensionClassLoader 和 AppClassLoader 都是 URLClassLoader 的子类,它们都是从本地文件系统里加载类库。

Class.forName