jdk9变化

简介: JDK 9 引入模块化系统(JPMS),改变了类加载的双亲委派模型。关键变化包括:模块可见性优先、类加载器与模块解耦、核心类隔离及自动模块支持。新模型通过 `requires`、`exports` 和 `opens` 等机制实现更严格的访问控制,增强安全性与模块化,同时保留兼容性,使传统 JAR 可平滑过渡。

jdk9变化

关键变化点

步骤

传统双亲委派(JDK 8 及以前)

JPMS 双亲委派(JDK 9+)

可见性检查

无(仅依赖类路径)

优先检查模块间的requires

、exports

、opens

委派规则

无条件委派给父类加载器

受模块可见性限制,即使父类能找到类也可能拒绝加载

加载范围

类路径(classpath

)和扩展目录

模块路径(--module-path

)和自动模块

核心类隔离

依赖引导类加载器加载核心类

由模块系统强制隔离,防止非法访问核心模块

动态加载

依赖类路径和反射权限

需遵循模块的opens

和reflects

规则

三、示例流程对比

场景 1:加载核心模块类(如java.lang.String)

plaintext

传统流程:
应用类加载器 → 扩展类加载器 → 引导类加载器(成功加载)
JPMS流程:
1. 应用类加载器检查模块可见性:java.base模块对所有模块自动可见
2. 委派至引导类加载器(成功加载)

场景 2:跨模块加载非导出类

java

// 模块A
module a {
    exports com.example.a.public; // 仅导出public包
    // 未导出com.example.a.internal
}
// 模块B尝试加载com.example.a.internal.Class
JPMS流程:
1. 应用类加载器检查模块可见性:模块B未被授权访问a.internal
2. 即使委派至父类加载器(能找到类),仍因可见性规则拒绝加载
3. 抛出ClassNotFoundException

场景 3:加载自动模块类

java

// 自动模块legacy.jar(未声明module-info.java)
// 包含类com.legacy.LegacyClass
// 模块modern尝试加载LegacyClass
JPMS流程:
1. 应用类加载器检查模块可见性:
   - 自动模块向所有模块导出所有包
   - 模块modern隐式requires所有自动模块
2. 委派至父类加载器(未找到)
3. 应用类加载器从模块路径加载LegacyClass(成功)

四、流程图(简化版)

流程图(简化版)

plaintext

类加载请求 → [当前加载器]
           |
           ├─ 检查已加载? → 是 → 返回类
           |
           ├─ 检查模块可见性? → 否 → 抛出ClassNotFoundException
           |
           ├─ 委派给父类加载器 → [父类加载器重复上述流程]
           |
           └─ 父类加载失败 → 自身尝试加载 → 成功 → 返回类
                                       → 失败 → 抛出ClassNotFoundException

五、总结

JDK 9 的双亲委派模型通过模块可见性优先和加载器与模块解耦,实现了更严格的类访问控制:


  1. 安全性增强:防止未授权模块访问其他模块的非导出类。
  2. 模块化支持:类加载与模块依赖关系紧密绑定,确保依赖一致性。
  3. 兼容性保留:通过自动模块机制支持传统 JAR 文件,平滑过渡到模块化系统。

类加载过程

相关文章
|
5月前
|
人工智能 安全 开发工具
Claude Code 官方工作原理与使用指南
Claude Code 不是传统代码补全工具,而是 Anthropic 推出的终端 AI 代理,具备代理循环、双驱动架构(模型+工具)、全局项目感知、6 种权限模式等核心能力,本文基于官方文档系统解析其工作原理与高效使用技巧。
4064 0
|
存储 SQL 分布式计算
Lakehouse架构指南
Lakehouse架构指南
964 2
|
5月前
|
存储 安全 关系型数据库
【MySQL】MySQL日志体系:redo log/undo log/binlog 三者区别、两阶段提交、如何保证数据一致性
MySQL三大核心日志:undo log(保障原子性,支持回滚与MVCC)、redo log(保障持久性,崩溃恢复,WAL机制)、binlog(保障可复制性,主从同步与数据恢复)。三者分属不同层级,协同实现ACID与高可用。
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
Agent = Model + Harness:模型决定上限Harness 决定下限
Claude Code、Cursor等并非聊天界面,而是AI编码的“操作系统”——Harness。它决定模型能否稳定执行规则、调用工具、管理上下文与权限。模型定上限,Harness定下限。差异常源于Harness配置,而非模型本身。
787 5
|
7月前
|
编解码 API Python
拼多多按图搜索商品API技术实践指南
拼多多图片搜索API简介:通过POST请求,传入Base64或URL图片,支持商品以图搜货。需用client_id/client_secret鉴权及MD5签名,图片限JPG/PNG、≤500KB、800×600以上。返回商品ID、名称、价格(分)、主图等信息。(239字)
1018 0
|
11月前
|
架构师 IDE Java
【Java架构师】Maven中lombok那点事
SpringBoot项目中Lombok需在maven-compiler-plugin中配置`annotationProcessorPaths`,确保编译期生成getter/setter等方法;而`excludes`则在打包时排除Lombok依赖,减小体积,因运行时已无需该库。
921 1
|
SQL 存储 数据库
Flink + Paimon 数据 CDC 入湖最佳实践
Flink + Paimon 数据 CDC 入湖最佳实践
3491 59
|
弹性计算 分布式计算 网络协议
聊聊复杂网络环境下hdfs的BlockMissingException异常|参数dfs.client.use.datanode.hostname
企业真实的网络环境是复杂多变的,在复杂的网络环境中部署并使用 hadoop 时,如果服务端的配置或客户端的使用不当,就可能会遇见各种问题。
聊聊复杂网络环境下hdfs的BlockMissingException异常|参数dfs.client.use.datanode.hostname
|
JSON Kubernetes 数据中心
k8s--命名空间 namespaces
k8s--命名空间 namespaces
|
JavaScript 前端开发 调度
事件驱动模型
【10月更文挑战第7天】事件驱动模型
967 7

热门文章

最新文章