该方法返回一个 URLClassLoader 实例(JDK 8 及以前为 sun.misc.Launcher$AppClassLoader,JDK 9+ 为 jdk.internal.loader.ClassLoaders$AppClassLoader),是委托链中离应用代码最近的默认类加载器。

直接调用 ClassLoader.getSystemClassLoader() 就能拿到 JVM 启动时创建的系统类加载器(即 AppClassLoader),它负责加载 -classpath 或 CLASSPATH 指定路径下的类,无需额外配置或判断。
它返回的是什么?
该方法返回一个 URLClassLoader 实例(具体是 sun.misc.Launcher$AppClassLoader,JDK 9+ 中为 jdk.internal.loader.ClassLoaders$AppClassLoader),是委托链中离应用代码最近的“默认”加载器。它不是 Bootstrap 或 Extension ClassLoader,但会向上委托给它们。
常见用途与注意事项
-
加载资源文件:比如读取
config.properties,可用ClassLoaders.getSystemClassLoader().getResourceAsStream("config.properties") -
动态加载类:如
Class.forName("com.example.MyService", true, ClassLoader.getSystemClassLoader()),显式指定加载器避免上下文问题 -
不适用于所有场景:Web 应用(如 Tomcat)中,线程上下文类加载器(
Thread.currentThread().getContextClassLoader())通常更准确,因为系统类加载器无法访问 WEB-INF/classes 或 lib -
不可用于加载模块化类(JDK 9+):如果目标类在命名模块中且未对系统类加载器导出,会抛
ClassNotFoundException
简单验证方式
打印它的类型和父加载器可快速确认:
ClassLoader sysCl = ClassLoader.getSystemClassLoader(); System.out.println(sysCl); // 输出 AppClassLoader 实例 System.out.println(sysCl.getParent()); // 通常是 ExtClassLoader System.out.println(sysCl.getParent().getParent()); // null(Bootstrap ClassLoader 不是 Java 对象)
替代方案提醒
多数情况下,推荐优先使用当前类的类加载器:MyClass.class.getClassLoader(),它和系统类加载器通常一致,语义更清晰;只有明确需要“启动时默认路径”的逻辑才用 getSystemClassLoader()。











