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);这些集合不可修改、不允许 null;Set.of 和 Map.of 也不允许重复元素或键。
Stream、Optional 与接口增强
Stream.takeWhile、dropWhile、iterate重载、ofNullableOptional.ifPresentOrElse、or、stream- 接口支持
private方法,用于复用默认方法内部逻辑 - try-with-resources 可以直接使用 effectively final 的已有变量
- 匿名内部类支持菱形操作符
<>
平台与工具变化
| 特性 | 说明 |
|---|---|
ProcessHandle | 查询和控制本地进程 |
Flow API | Reactive Streams 规范对应的发布订阅接口 |
StackWalker | 按需遍历调用栈 |
VarHandle | 以标准 API 提供变量访问与内存语义控制 |
| HTTP/2 Client | 孵化阶段,JDK 11 才成为正式 API |
jlink | 根据模块生成裁剪后的运行时镜像 |
| Multi-Release JAR | 同一 JAR 为不同 Java 版本提供实现 |
--release | 编译时同时约束语言、字节码和平台 API 版本 |
| Unified Logging | JVM 日志统一使用 -Xlog 配置 |
JVM 变化
- G1 成为默认垃圾收集器。
- Compact Strings 使用
byte[]配合编码标记降低常见字符串内存占用。 - 模块化运行时镜像取代传统的
rt.jar布局。 - JDK 内部 API 开始被封装,旧框架的非法反射访问会产生警告。
迁移关注
- 不要依赖
sun.*、com.sun.*等内部 API。 - 反射框架需要正确使用
exports/opens,或升级到支持 JPMS 的版本。 List.of等返回的不是Collections.unmodifiableList包装器,不应依赖具体实现类。