当前位置: 首页 > news >正文

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自动裁剪,用什么裁什么
http://www.gsyq.cn/news/1587655.html

相关文章:

  • 别再死磕SEO!AI时代新流量入口GEO,抢占AI答案推荐位
  • 一键解锁无损音乐宝藏:TIDAL Downloader Next Generation 高解析度音频下载全攻略
  • 云计算作业3
  • 诊断证明翻译怎么办理?诊断证明翻译怎么线上办理?
  • H3C S5130 交换机 SSH 远程开局配置指南
  • 豆包大模型2.1 Pro发布深度解析:日均180万亿Token背后的中国AI编程新王座
  • 中国远程控制行业研究报告(2026):从连接工具到智能生产力基座的演进路径
  • 微软详细说明 Windows 11 版本 26H2 的支持生命周期
  • Outfit字体:9种字重的开源几何无衬线字体如何重塑现代设计系统
  • 苹果端侧AI实战:分层智能架构与Core ML深度优化指南
  • Gmail邮箱批量生成终极指南:5分钟解锁Python自动化黑科技
  • 在线测速与本地 ping 的本质区别
  • 苹果Siri系统级LLM重构:端侧大模型与隐私优先架构解析
  • 【共创季稿事节】 鸿蒙原生 ArkTS 布局实战:Tabs + animateTo 实现页面切换过渡动画
  • 跨境搬迁智能导航系统:行政流程语义编排引擎设计
  • AI 能合法“二创“周星驰经典了?聊聊 Seedance 2.5 背后的版权新玩法
  • MC9RS08LE4 ADC低功耗配置:停止模式下ADACK时钟唤醒与精度优化
  • 干了8年Java,我才把这些并发工具捋明白(实战血泪总结)
  • LSTM股票波动率与价格区间预测实战指南
  • Cloudflare开源的cloudflared,不碰防火墙就能暴露内网服务
  • 公考备考资料太多怎么选?粉笔适合做主线学习工具吗
  • 人工智能专业术语详解(T)
  • 有小伙伴问:Python的 __init__.py 该不该存在?
  • Cloudflare 联手三大浏览器,PACT 协议能否彻底终结验证码时代?
  • 联邦学习实战指南:数据不出域的AI协作范式
  • 现在开始提升短视频宣传质量
  • JMeter接口测试入门:从零到一掌握核心组件与实战技巧
  • Log4Shell漏洞复现与防御:从JNDI注入到远程代码执行实战
  • ArcObjects SDK 10.8实战指南:构建企业级地理信息系统的核心技术架构
  • 毕业论文神器!2026年闭眼可入的专业AI论文写作软件