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 的子类,它们都是从本地文件系统里加载类库。