扩展类加载器(extension classloader)是 java 双亲委派模型中的第二层,主要负责加载 ${java.ext.dirs} 系统属性指定的目录下的 jar 包。它位于启动类加载器之上、应用程序类加载器之下,用于加载那些不需要修改核心 api 但需要被所有应用共享的扩展功能库。

扩展类加载器的具体职责是什么
扩展类加载器专门负责加载 Java 平台的扩展目录中的类库。在 JDK 8 及更早版本中,这个目录通常是 JRE/lib/ext;从 JDK 9 开始,随着模块化系统的引入,其作用逐渐被模块路径取代,但在传统双亲委派机制中仍保留此角色。开发者通常无需直接操作它,除非需要自定义类加载行为或加载非标准位置的扩展库。

import java.lang.reflect.Method;
public class ExtensionClassLoaderDemo {
public static void main(String[] args) {
// 获取扩展类加载器实例
ClassLoader extLoader = ClassLoader.getSystemClassLoader().getParent();
System.out.println("扩展类加载器: " + extLoader);
System.out.println("父加载器(启动类加载器): " + extLoader.getParent());
// 列出扩展目录中的部分 JAR 文件
String extDirs = System.getProperty("java.ext.dirs");
System.out.println("扩展目录路径: " + extDirs);
}
}
如何验证扩展类加载器的加载范围
通过检查 java.ext.dirs 系统属性可以确认扩展类加载器实际扫描的目录。在大多数现代 JVM 实现中,如果该目录为空或未配置,扩展类加载器将不会加载任何额外类,此时其行为接近于一个空的委托节点。开发者可以通过放置自定义 JAR 到该目录并重启 JVM 来观察类是否被成功加载,从而验证其工作机制。

// 假设在 ext 目录下有一个 myext.jar
// 包含类 com.example.MyExtClass
import java.net.URL;
import java.net.URLClassLoader;
public class VerifyExtLoading {
public static void main(String[] args) throws Exception {
ClassLoader sysLoader = ClassLoader.getSystemClassLoader();
ClassLoader parent = sysLoader.getParent(); // 即 ExtClassLoader
if (parent != null) {
// 尝试加载一个已知存在于 ext 目录的类
try {
Class> clazz = parent.loadClass("com.example.MyExtClass");
System.out.println("成功加载: " + clazz.getName());
System.out.println("由加载器: " + clazz.getClassLoader());
} catch (ClassNotFoundException e) {
System.out.println("未找到类,可能不在 ext 目录或已移除");
}
} else {
System.out.println("无父类加载器,可能是自定义 JVM 环境");
}
}
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











