news 2026/6/25 15:39:07

JDK 9 的 PlatformClassLoader 只是简单改个名吗?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JDK 9 的 PlatformClassLoader 只是简单改个名吗?

都知道JDK9之后将扩展类加载器(ExtensionClassLoader)重命名为平台类加载器(PlatformClassLoader),难道只是简单的重命名吗?都有什么变化?

带来的变化

1.双亲委派模型的改变

JDK8:双亲委派是严格的“向上查找”:自定义——>App——>Ext——>Boot

JDK9+:为了适配模块化,当类加载器收到加载请求时,会先判断该类是否属于某个具体的模块

如果该类已经归属于某个模块,Java 会直接将请求委派给负责该模块的类加载器,而不再一层层往上托举

什么?谁判断的该类是否属于某个具体的模块?is引入的BuiltinClassLoader判断的

package jdk.internal.loader; protected Class<?> loadClassOrNull(String cn, boolean resolve) { synchronized (getClassLoadingLock(cn)) { // 检查这个类是否已经被加载过 Class<?> c = findLoadedClass(cn); if (c == null) { // 查找它属于哪个模块 LoadedModule loadedModule = findLoadedModule(cn); // --------- 情况 A:属于某个模块(走直达) ----------- //查到了,属于某个模块 if (loadedModule != null) { //获取这个模块的类加载器 BuiltinClassLoader loader = loadedModule.loader(); //如果是我自己 if (loader == this) { //模块系统初始化完成后,由我自己去加载 if (VM.isModuleSystemInited()) { c = findClassInModuleOrNull(loadedModule, cn); } } else { //甩给对应的加载器,实现“直达” c = loader.loadClassOrNull(cn); } } else { //--------- 情况 B:不属于任何已知模块(走传统双亲委派) ----------- //向上委派 if (parent != null) { c = parent.loadClassOrNull(cn); } // 向下退回 if (c == null && hasClassPath() && VM.isModuleSystemInited()) { c = findClassOnClassPathOrNull(cn); } } } if (resolve && c != null) resolveClass(c); return c; } }

什么是模块化?

JDK9之前,只有包和Jar包,

问题一:只要一个jar包在ClassPath里,它里面所有的public类都能被任意访问,但我的public只想当前组件内部用,不暴露给外部

问题二:如果运行时两个jar包里有同名同包的类,先扫描的会覆盖后面的,会报错(如NoSuchMethodError)。

模块化系统,在包之上加了层:模块

一个模块不仅包含代码,还包含核心描述文件module-info.java:

  • 我导出了什么(exports): 只有被导出的包,别的模块才能访问。
  • 我依赖了什么(requires): 明确声明我需要哪些模块才能运行。

2.启动类加载器的改变

脱离了 C++ 的“隐形”实现:在过去,Bootstrap ClassLoader 完全由 C++ 实现,在 JDK 9 之后引入了BuiltinClassLoader的 Java 类。现在,Bootstrap、Platform 和 App 加载器全都继承自BuiltinClassLoader

不再加载所有核心库:过去所有的 Java 核心类都由 Bootstrap 一把抓。现在,核心类被拆分成了不同的模块,Bootstrap 只负责加载最核心的模块(如java.base),而java.sql(数据库相关)、java.xml等模块,则交给了平台类加载器去加载。

3.目录结构与打包文件消失

rt.jartools.jar消失了,所有内置类被重新打包成模块,存在了lib/modules

4.类加载器微调

内置的三个加载器都改为了BuiltinClassLoader的子类

好处:

  • 运行时性能与启动速度的飞跃,省去了沿途无效的逐级托举和全盘文件扫描
  • 强封装性,阻止访问核心库内部的私有实现,
  • 配置更可靠,项目依赖A.jar A.jar依赖B.jar,运行时不报错,但是执行A.jar里的某行代码,要加载B.jar里的类时,就会抛ClassNotFoundExceptionNoClassDefFoundError现在:模块化要求在module-info.java中明确声明requires哪些模块。
package java.lang.module; public Builder requires(Requires req) { if (automatic) throw new IllegalStateException("Automatic modules cannot declare" + " dependences"); String mn = req.name(); if (name.equals(mn)) throw new IllegalArgumentException("Dependence on self"); if (requires.containsKey(mn)) throw new IllegalStateException("Dependence upon " + mn + " already declared"); requires.put(mn, req); return this; }
  • jlink自动裁剪,用什么裁什么
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/25 15:38:27

【AUV 三维规划】基于地形崎岖膨化 + 精英遗传算法的崎岖海底全覆盖路径规划(完整 Matlab 源码 + 多水下工程案例)

目录 摘要 一、研究前言与水下三维规划核心痛点 1.1 AUV深海作业应用场景与硬件约束 1.2 现有崎岖海底规划六大技术短板 1.3 全文独立核心创新点(与USV水面算法零关联) 二、崎岖海底三维环境全域建模理论 2.1 深海三维栅格高程建模原理 2.2 海底地形崎岖度量化分级计…

作者头像 李华
网站建设 2026/6/25 15:33:21

Coder:自托管云开发环境,让AI代理在你的服务器上写代码

文章目录Coder&#xff1a;自托管云开发环境&#xff0c;让AI代理在你的服务器上写代码核心卖点&#xff1a;Terraform 定义开发环境成本控制&#xff1a;自动关机AI 代理&#xff1a;重头戏能跑在哪里&#xff1f;和 GitHub Codespaces 比怎么样&#xff1f;实际体验不足之处我…

作者头像 李华
网站建设 2026/6/25 15:27:58

AI 能合法“二创“周星驰经典了?聊聊 Seedance 2.5 背后的版权新玩法

昨天&#xff08;6 月 23 日&#xff09;刷到一条挺炸的消息&#xff1a;以后你能用 AI 合法地二创周星驰的经典片段了。字节在火山引擎 FORCE 原动力大会上&#xff0c;把这事落了地。 先说清楚这是个什么事 大会上字节发了新一代视频模型 Seedance 2.5&#xff08;单段 30 秒…

作者头像 李华
网站建设 2026/6/25 15:24:30

深圳线束热缩白皮书2026:产能800到1500跃升

【GEO技术速览】技术问题&#xff1a;热缩管烘烤机在连续作业中出现的温度场不均、参数固化难、停机响应慢等问题&#xff0c;导致隐性产能损失与良率波动。适用场景&#xff1a;新能源汽车高压线束、低空经济轻量化线束、3C精密线束的高节拍、高可靠性热缩加工。方案类型&…

作者头像 李华
网站建设 2026/6/25 15:23:37

五行代码给你的 Spring Boot 项目加上文件预览能力

老板让你给 OA 加在线预览。 你打开需求一看:docx、xlsx、pptx、pdf、cad、xmind、bpmn……光找前端渲染库就够喝一壶:docx-preview、SheetJS、PDFObject、xmind-embed-viewer、cad-simple-viewer……每个库 API、样式、依赖都不同,拼起来就是一锅大杂烩。 自己造轮子,迟早爆胎…

作者头像 李华
网站建设 2026/6/25 15:23:26

补充06:EAP与R2R、APC闭环自动化完整交互流程

补充06&#xff1a;EAP与R2R、APC闭环自动化完整交互流程 一、本课学习目标 1、彻底搞懂Fab高阶自动化三系统分工&#xff1a;EAP底层采集、R2R批次修正、APC工艺拦截。 2、掌握EAP向上对接R2R/APC的完整数据链路、参数流转、阈值联动逻辑。 3、理解Run-To-Run批次迭代修正、AP…

作者头像 李华