You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JDK8-17中Java ServiceLoader使用系统还是平台/扩展类加载器?

关于ServiceLoader.loadInstalled()的类加载器问题解答

是的,loadInstalled()方法确实会使用扩展类加载器(JDK8)或平台类加载器(JDK9至JDK17),原因主要围绕类加载器的职责边界与服务加载的设计目标:

  • 职责匹配:Platform/Extension类加载器的核心定位就是加载JDK自身提供的扩展服务与标准库扩展组件。这些服务属于JDK生态的一部分,并非应用级自定义服务,由该类加载器从JDK专属路径(JDK8的ext目录、JDK9+的平台模块路径)加载,完全符合其职责划分。
  • 隔离冲突:若使用系统类加载器加载JDK自带的扩展服务,可能与应用CLASSPATH中同名的自定义服务类产生冲突。借助Platform/Extension类加载器可隔离JDK级服务与应用级服务,保障JDK核心扩展的稳定性。
  • 层级约束与共享性:遵循双亲委派模型,Platform/Extension类加载器是系统类加载器的父加载器,它加载的类对所有应用可见且无法被应用代码覆盖(除非破坏双亲委派)。这保证了JDK自带的标准服务实现能被所有应用共享,且不会被篡改。
  • 模块化适配(JDK9+):JDK9引入模块化后,平台类加载器负责加载java.*之外的平台模块(如javax.*、jdk.*下的扩展模块),loadInstalled()方法适配这一变化,继续使用平台类加载器加载JDK内置服务实现,保持API行为的一致性。

需要明确的是:如果是应用自定义的服务(放在CLASSPATH或应用模块路径下),应当使用load()方法(默认使用当前线程上下文类加载器,通常为系统类加载器);loadInstalled()是专门为加载JDK自身提供的扩展服务设计的。

内容的提问来源于stack exchange,提问作者foo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 01:17:08