# 1. JPMS 模块系统(Jigsaw)解决的核心问题,强封装与显式依赖 A JPMS 通过 exports 强封装(未导出包不可见)、requires 显式依赖(模块图明确),解决类路径地狱与封装问题 ✓ 正确答案 B classpath 已足够 C JPMS 只解决性能 D 无强封装
# 2. module-info.java 的 module/requires/exports/opens 声明语法与模块描述符 A module-info 只声明模块名 B 无 opens C module-info.java 是模块描述符,用 module/requires/exports/opens/uses/provides 声明模块名、依赖、导出/开放、服务 ✓ 正确答案 D 无 provides
# 3. 模块可读性(readability)与 requires transitive 如何影响编译与运行 A transitive 只影响运行 B requires transitive 使下游模块自动可读传递依赖,简化依赖声明,影响编译可见性与运行模块图 ✓ 正确答案 C 无传递 D 下游需显式 requires
# 4. 未命名模块与类路径(classpath)兼容机制,自动模块(automatic module)如何生成模块名 A classpath 属未命名模块 B classpath 属未命名模块(可读所有模块),非模块化 jar 放 module path 成自动模块(导出所有包),模块名用 Automatic-Module-Name 或文件名推导 ✓ 正确答案 C 自动模块不导出 D 未命名模块不可读
# 5. exports 与 opens 的区别,反射访问为何依赖 opens 而不是 exports A exports 允许编译期正常访问,opens 允许运行时反射访问(setAccessible 私有成员),反射框架依赖 opens 而非 exports ✓ 正确答案 B opens 用于编译期 C exports 允许反射 D 两者相同
# 6. 限定导出 exports ... to 与限定打开 opens ... to,如何把内部 API 仅暴露给白名单模块,与全局导出的安全差异 A exports ... to 全局导出 B 无白名单 C exports/opens ... to 指定白名单模块(只对它们可见/可反射),比全局导出更安全(最小暴露) ✓ 正确答案 D 与全局相同
# 7. --add-opens/--add-exports/--add-modules 在迁移遗留应用时的使用边界与安全风险 A 用于迁移访问强封装内容,但过度开放削弱封装、增安全风险,应最小化并迁移到公开 API ✓ 正确答案 B 无安全风险 C 应广泛开放 D 无边界
# 8. Module Layer 与模块解析(resolve)流程,ServiceLoader 的 provides/uses 声明如何协作 A provides/uses 不参与模块 B ServiceLoader 不用模块图 C 模块解析按 requires 构建模块图到 Module Layer,provides/uses 声明让 ServiceLoader 在模块图查找服务实现 ✓ 正确答案 D 无 provides
# 9. 模块化应用与 Spring Boot 可执行 jar(非模块化)的边界,为何多数 Spring Boot 应用仍是 classpath 而非 module path A Spring Boot 默认 module path B Spring Boot 已模块化 C 无边界 D 多数 Spring Boot 应用因第三方库未模块化、fat jar 与模块不兼容、反射与强封装冲突,默认 classpath 而非 module path ✓ 正确答案
# 10. jlink 定制运行时镜像的裁减原理,--add-modules/--strip-debug/--compress 的工程价值 A jlink 打包完整 JDK B jlink 按模块依赖生成定制镜像,--add-modules 只含所需模块、--strip-debug 去调试、--compress 压缩,体积小自包含 ✓ 正确答案 C 无裁减 D --add-modules 不限制模块
# 11. jpackage 打包原生安装包(msi/dmg/deb)的流程与运行时裁剪配合 A jpackage 需用户装 JDK B jpackage 打包原生安装包(msi/dmg/deb),配合 jlink 裁减运行时生成自包含应用,无需用户装 JDK ✓ 正确答案 C jpackage 不裁减 D 只支持 jar
# 12. 模块图(module graph)与循环依赖检测,模块系统如何从根源阻止模块间循环 A 模块解析构建模块图并检测循环,模块依赖必须是 DAG,循环依赖编译/运行期报错,从根源阻止 ✓ 正确答案 B 模块可循环依赖 C 循环依赖允许 D 无检测
# 13. 强封装对反射框架(Spring/Hibernate/Jackson)的影响,为何 JDK 17+ 需要维护 --add-opens 清单 A 强封装不影响反射 B 框架无反射 C 无需清单 D JDK 17+ 强封装限制反射访问 JDK 内部,反射框架需 --add-opens 清单开放所需包,否则反射抛异常 ✓ 正确答案
# 14. module-info 中的版本化模块与 Maven 坐标(groupId/artifactId/version)的映射关系 A 模块名含版本 B 模块名含 groupId C 版本写入 module-info D module-info 模块名通常等于 artifactId,groupId/version 由 Maven 管理(不写入 module-info),版本由构建管理 ✓ 正确答案
# 15. jdeps 在模块化迁移中的用法,分析 jar 依赖、生成 module-info 建议并输出 jlink 所需的最小模块集 A jdeps 分析 jar 依赖、--generate-module-info 生成 module-info 建议、--print-module-deps 输出最小模块集,辅助模块化迁移与 jlink ✓ 正确答案 B jdeps 只分析运行 C 无迁移辅助 D 不输出模块集
# 16. --patch-module 的用途与边界,测试与热修复时覆盖模块内类,与 classpath 覆盖、jlink 镜像修改的区别 A 与 classpath 覆盖相同 B 无边界 C 只能打包时 D --patch-module 运行时覆盖模块类(测试/热修复),比 classpath 覆盖可靠,且不改 jlink 镜像(动态补丁) ✓ 正确答案
# 17. 多版本 jar(Multi-Release JAR)与 META-INF/versions 的机制与应用场景 A MR-JAR 所有版本一样 B MR-JAR 的 MANIFEST 声明 Multi-Release,META-INF/versions/<version> 按 JDK 版本提供类实现,用于库跨版本兼容并利用新特性 ✓ 正确答案 C 无版本目录 D 只支持一个版本
# 18. 模块描述符的 uses/provides 声明与 SPI 的编译期校验 A 无编译期校验 B 校验只在运行 C uses/provides 声明模块化 SPI,javac 编译期校验服务接口/实现类存在、类型正确,保证 SPI 声明安全 ✓ 正确答案 D 实现无需实现接口
# 19. Project Jigsaw 的模块化迁移策略,自上而下(top-down)与自下而上(bottom-up)两条路径 A 只能一次性迁移 B 自上而下先模块化应用顶层(底层用自动模块过渡),自下而上先模块化底层库,渐进式迁移用自动模块过渡 ✓ 正确答案 C 无过渡 D 两条路径相同
# 20. JMOD 格式与 jmod 工具,模块打包与 jar 的差异(含 native 代码与 legal 文件),何时使用 jmod A jmod 与 jar 相同 B jmod 无 native C jmod 用于运行期 D jmod 可含 native 代码/legal 文件,用于 jlink/编译期/系统模块,运行期用 jar;含 native 的模块用 jmod ✓ 正确答案
# 21. jpackage 的启动器配置,--java-options 注入堆大小等 JVM 参数、图标与安装包元数据,以及跨平台打包的差异 A jpackage 无 JVM 参数 B 跨平台无差异 C 无图标配置 D --java-options 注入 JVM 参数、--icon/--app-version 配置图标元数据,跨平台差异(Windows msi/exe、macOS dmg、Linux deb/rpm)按平台生成 ✓ 正确答案