Skip to content

JDK 9

JDK 9 最大的变化是 JPMS 模块系统,同时开始采用每六个月一个功能版本的发布节奏。

Java Platform Module System

模块通过 module-info.java 显式声明依赖与对外开放的包。

java
module com.example.order {
    requires java.sql;
    exports com.example.order.api;
}
关键字作用
requires声明依赖模块
exports向其他模块公开包
opens允许运行时深度反射
uses / provides声明服务消费与实现

模块化不是普通依赖管理的替代品;它解决的是运行时可读性、强封装和可靠配置问题。

JShell

jshell 提供 REPL,可直接试验表达式、API 和小段代码。

text
jshell> List.of("Java", "Redis").stream().map(String::toUpperCase).toList()

集合工厂方法

java
List<String> list = List.of("a", "b");
Set<Integer> set = Set.of(1, 2, 3);
Map<String, Integer> map = Map.of("a", 1, "b", 2);

这些集合不可修改、不允许 nullSet.ofMap.of 也不允许重复元素或键。

Stream、Optional 与接口增强

  • Stream.takeWhiledropWhileiterate 重载、ofNullable
  • Optional.ifPresentOrElseorstream
  • 接口支持 private 方法,用于复用默认方法内部逻辑
  • try-with-resources 可以直接使用 effectively final 的已有变量
  • 匿名内部类支持菱形操作符 <>

平台与工具变化

特性说明
ProcessHandle查询和控制本地进程
Flow APIReactive Streams 规范对应的发布订阅接口
StackWalker按需遍历调用栈
VarHandle以标准 API 提供变量访问与内存语义控制
HTTP/2 Client孵化阶段,JDK 11 才成为正式 API
jlink根据模块生成裁剪后的运行时镜像
Multi-Release JAR同一 JAR 为不同 Java 版本提供实现
--release编译时同时约束语言、字节码和平台 API 版本
Unified LoggingJVM 日志统一使用 -Xlog 配置

JVM 变化

  • G1 成为默认垃圾收集器。
  • Compact Strings 使用 byte[] 配合编码标记降低常见字符串内存占用。
  • 模块化运行时镜像取代传统的 rt.jar 布局。
  • JDK 内部 API 开始被封装,旧框架的非法反射访问会产生警告。

迁移关注

  • 不要依赖 sun.*com.sun.* 等内部 API。
  • 反射框架需要正确使用 exports/opens,或升级到支持 JPMS 的版本。
  • List.of 等返回的不是 Collections.unmodifiableList 包装器,不应依赖具体实现类。