Java 17 的特性

这算是炒冷饭吗?

Posted by Autuan.Yu on April 8, 2022

JDK 17的特性

写在前头

2022 年 3 月 30 日,SpringFramework 出现安全漏洞

可以看这篇文章

简单的来说,就是这两种情况:

  1. JDK 版本号 9 及以上的
  2. 使用了Spring 框架或衍生框架

如果小伙伴们要将 JDK 17 的特性应用到生产环境,需要先考虑这个问题哟。

简单描述

Java 17 在 2021 年 9 月 14 日发布。 是目前最新的长期支持版本(LTS) 。

上一个LTS 是在 2018 年 9 月 发布的 Java 11 。

(按oracle发布的Java 路线图推算,下一个LTS 将于 2025 年 9 月发布 )

OpenJdk 17 的地址在这里

Java 17 的特性

通过OpenJdk 的网站我们可以看到,17 主要有 14 个特性:

306: Restore Always-Strict Floating-Point Semantics 356: Enhanced Pseudo-Random Number Generators 382: New macOS Rendering Pipeline 391: macOS/AArch64 Port 398: Deprecate the Applet API for Removal 403: Strongly Encapsulate JDK Internals 406: Pattern Matching for switch (Preview) 407: Remove RMI Activation 409: Sealed Classes 410: Remove the Experimental AOT and JIT Compiler 411: Deprecate the Security Manager for Removal 412: Foreign Function & Memory API (Incubator)
414: Vector API (Second Incubator) 415: Context-Specific Deserialization Filters

博主按照自己的评判标准做了一下排序:

406 switch

switch 可以进行同 instanceof 的类型转换功能了:

之前:

if(obj instanceof String) {
    String str = (String)obj;
    // other doing ...
}

现在:

switch(obj) {
    case String str : // doing ..... ; break;
    default: break;
}

JEP 409:密封类(Sealed Classes)

密封类在 Java 15 中提供。 在 Java 17 中正式提供。

相比于 Java 15之前要不然不能继承,要不然可以随意继续的机制来说,密封类可以由开发人员指定部分类才可继承。

更加灵活了呢。

356 随机数生成器增强

Enhanced Pseudo-Random Number Generators
RandomGenerator 为 PRNG 伪随机数提供了新实现。
提供了 PRNG 的对象流,更好的支持了基于流的编程。

415:指定上下文的反序列化过滤器

在Java的历史上,有很多攻击都是通过序列化的方式进行的。

禁用反序列化过滤器可以提高系统的安全性。

306 严格的浮点语义

Restore Always-Strict Floating-Point Semantics

strictfp 关键词已不需要。

有关浮点计算,Java SE 1.2 之后,出于对性能的考虑,浮点的计算并没有严格遵守FP-strict的限制,符合IEEE-754规范。

随着摩尔定律,计算机性能的提升,之前所考虑的问题已不存在。

403 JDK安全:移除 –illegal-access JVM 参数

403 –illegal-access

对于普通的Java开发都来说是不需要在意的地方。

出于安全性考虑,禁止了深度反射。

对于一些使用到此功能的Java程序,可能会无法启动。

382 / 391 mac平台支持增强

New macOS Rendering Pipeline macOS/AArch64 Port

众所周知,Java 的一大特性就是跨平台,Java 17 对于 Mac 平台做出了优化:

  • 支持 MacOs AArch64 架构
  • MacOs 使用新的渲染库

Security Manager 本身使用的就很少,将在未来的版本移除。

398 / 407 / 410 / 411: 弃用或移除一些用不到的

Deprecate the Applet API for Removal
Remove RMI Activation
Remove the Experimental AOT and JIT Compiler
Deprecate the Security Manager for Removal

2022 年了,正经Java开发者谁还用 Applet 啊 [吃瓜]

412 / 414 孵化特性

Foreign Function & Memory API (Incubator) Vector API (Second Incubator) 孵化特性还有很多的不确定,大家知道就好~