当前位置: 首页 > 后端技术 > Java

本文总结了Java-JDK17发布的新特性

时间:2023-04-01 19:34:00 Java

简介:JDK17已如期于2021年3月16日发布。本文介绍JDK17的新特性。JDK17将于2021年9月14日正式发布(General-AvailabilityRelease)。JDK17将成为大多数供应商的长期支持(LMS)版本。最后一个LTS版本是JDK11,本文总结了JDK17发布的新特性。ReleaseNotes根据发布计划,本次发布的JDK17将是一个长期支持版本(LTS版本)。LTS版本每3年发布一次,上一个长期支持版本是2018年9月发布的JDK11。JDK17是JavaSEPlatformVersion17的开源参考实现,由JCP(JavaCommunityProcess)中的JSR392指定).安装包下载主要分为OpenJDK版和Oracle版。下载地址如下:OpenJDK版本:https://jdk.java.net/16/Oracle版本:https://www.oracle.com/java/t...以上版本若是个人学习用途,区别不大。但如果用于商业用途,则需要仔细查看相关授权。OracleJDK根据二进制代码许可协议获得许可,而OpenJDK根据GPLv2许可获得许可。更多Java基础知识可以参考《Java核心编程》这本书,里面介绍的很详细。JDK17新特性描述JEP406:switch的模式匹配(预览版)(JDK-8213076)规范通过switch表达式和语句的模式匹配以及模式语言的扩展增强了Java编程语言。将模式匹配扩展到switch可以让表达式被测试,每个表达式都有特定的操作,从而可以简洁安全地表达复杂的面向数据的查询。更多详细信息,请参阅JEP406JEP409:密封类(JDK-8260514)规范密封类(SealedClass)已添加到Java语言中。密封类和接口限制哪些其他类或接口可以扩展或实现它们。密封类包含在JEP360中,并在JDK15中作为预览功能提供。它们由JEP397再次提出并改进,并在JDK16中作为预览功能提供。现在,在JDK17中,密封类正在在JDK16中没有任何更改的情况下完成。JEP382:新的macOS渲染管道(JDK-8238361)用于渲染的client-libs/2dSwingAPIJava2DAPI现在可以使用适用于macOS的新AppleMetal加速渲染API。目前默认情况下这是禁用的,因此渲染仍然使用Apple弃用但仍然可用和支持的OpenGLAPI。要启用Metal,应用程序应通过设置系统属性来指定其使用:-Dsun.java2d.metal=trueMetal或OpenGL的使用对应用程序是透明的,因为这是内部实现差异,对Java没有影响应用程序接口。Metal管道需要macOS10.14.x或更高版本。将忽略在早期版本上设置此项的尝试。有关详细信息,请参阅[JEP382(https://openjdk.java.net/jeps...)用于大图标访问的新API(JDK-8182043)client-libs/javax.swingJDK17中提供了一个新APIjavax.swing.filechooser.FileSystemView.getSystemIcon(File,int,int)的方法,它允许尽可能访问更高质量的图标。它完全针对Windows平台实现;但是,其他平台上的结果可能会有所不同,稍后会得到增强。例如,通过使用以下代码:FileSystemViewfsv=FileSystemView.getFileSystemView();Iconicon=fsv.getSystemIcon(newFile("application.exe"),64,64);JLabel标签=newJLabel(icon);用户可以设置“application.exe”文件获得更高质量的图标。此图标适用于创建可以在HighDPI环境中更好地缩放的标签。DatagramSocket可以直接加入多播组(JDK-8237352)core-libs/java.netjava.net.DatagramSocket已在此版本中更新以添加对加入多播组的支持。它现在定义了用于加入和离开多播组的加入组和离开组方法。java.net.DatagramSocket的类级API文档已更新,以解释如何配置普通DatagramSocket以及如何使用它来加入和离开多播组。此更改意味着DatagramSocketAPI可以在多播应用程序中使用,而无需使用旧的java.net.MulticastSocketAPI。MulticastSocketAPI的工作方式与以前相同,尽管它的大部分方法已被弃用。有关此更改的基本原理的更多信息,请参阅CSRJDK-8260667JEP356:增强型伪随机数生成器(JDK-8193209)core-libs/java.util为伪随机数生成器(PRNG)和实现提供了新的接口类型,包括可跳转的PRNG和另一类可拆分PRNG算法(LXM)。IdealGraphVisualizer(JDK-8254145)热点/编译器的现代化IdealGraphVisualizer(IGV)是一种以可视化和交互方式探索HotSpotVMC2即时(JIT)编译器中使用的中间表示的工具,已实现现代化。增强功能包括:支持在最高JDK15(IGV底层NetBeans平台支持的最新版本)上运行IGV更快、基于Maven的IGV构建系统块形成、组删除和节点跟踪的稳定性在默认过滤器中更直观的着色排名更多自然默认行为和节点排序快速节点搜索现代化的IGV与早期JDK版本生成的图形部分兼容。它支持图形加载和可视化等基本功能,但节点聚类和着色等辅助功能可能会受到影响。有关构建和运行IGV的详细信息,请参见https://github.com/openjdk/jd…。“新API”的新页面和改进的“已弃用”页面(JDK-8263468)tools/javadoc(工具)JavaDoc现在可以生成一个总结API中最近更改的页面。要包含的最新版本列表使用--since命令行选项指定。这些值用于查找匹配@since的声明作为要包含在新页面上的标签。--since-label命令行选项提供要在“新API”页面的标题中使用的文本。在汇总弃用项目的页面上,您可以查看按版本分组的项目。SourceDetailsinErrorMessages(JDK-8267126)tools/javadoc(tools)当JavaDoc在输入源文件中报告问题时,它会以类似于编译器(javac)诊断消息的方式显示有问题的源代码行,以及源代码行包含带有指向行位置的插入符号(^)的行。此外,日志记录和其他“信息”消息现在被写入标准错误流,将标准输出流留给命令行选项特别请求的输出,例如命令行帮助。JEP412:外部函数和内存API(孵化)(JDK-8265033)core-libs引入了一个API,Java程序可以通过该API与Java运行时之外的代码和数据进行互操作。此API使Java程序能够调用本机库并操作本机数据,而没有JNI的漏洞和危险。有关详细信息,请参阅JEP412控制台字符集API(JDK-8264208)core-libsjava.io.Console已更新以定义返回控制台字符集的新方法。返回的Charset可能与Charset.defaultCharset()方法返回的Charset不同。例如,它返回IBM437,而Charset.defaultCharset()在Windows(en-US)上返回windows-1252。有关详细信息,请参阅https://bugs.openjdk.java.net...。用于反序列化的JDK飞行记录器事件(JDK-8261160)core-libs/java.io:serialization现在可以使用JDK飞行记录器(JFR)监视对象的反序列化。当启用JFR并且JFR配置包含反序列化事件时,只要运行器尝试反序列化对象,JFR就会发出一个事件。反序列化事件名为jfr.Derialization,默认情况下处于禁用状态。反序列化事件包含序列化过滤机制使用的信息;请参阅对象输入过滤器规范。此外,如果启用过滤器,则JFR事件指示过滤器是接受还是拒绝对象的反序列化。有关如何使用JFR反序列化事件的更多信息,请参阅文章监视反序列化以提高应用程序安全性。有关使用和配置JFR的参考信息,请参阅JDK任务控制文档的JFR运行时指南和JFR命令参考章节。JEP415:ImplementingContext-SpecificDeserializationFilters(JDK-8264859)core-libs/java.io:serializationJEP415:Context-SpecificDeserializationFilters允许应用程序配置特定上下文和动态选择的反序列化过滤器,这个工厂被称为为每个单独的反序列化操作选择一个过滤器。JavaCoreLibraryDeveloper'sGuideforSerializationFiltering描述了用例并提供了示例。本机字符编码名称的系统属性(JDK-8265989)core-libs/java.lang引入了一个新的系统属性native.encode。此系统属性提供底层主机环境的字符编码名称。例如,它通常在Linux和macOS平台上使用UTF-8,在Windows(en-US)上使用Cp1252。有关详细信息,请参阅https://bugs.openjdk.java.net...。添加java.time.InstantSource(JDK-8266846)core-libs/java.time引入了一个新接口java.time.InstantSource。该接口是java.time.Clock的抽象,只关注当前时刻,不涉及时区。十六进制格式和解析实用程序(JDK-8251989)core-libs/java.utiljava.util.HexFormat为原始类型和字节数组提供十六进制和十六进制之间的转换。返回HexFormat实例的工厂方法提供了分隔符、前缀、后缀和大写或小写的选项。实验性编译器黑洞支持(JDK-8259316)热点/编译器添加了对编译器黑洞的实验性支持。这些对于低级基准测试很有用,可以在不影响基准性能的情况下避免关键路径上的死代码消除。当前支持以CompileCommand的形式实现,可通过-XX:CompileCommand=blackhole访问,并计划最终将其升级为公共API。JMH已经能够在指示/可用时自动检测和使用此设施。有关后续步骤,请参阅JMH文档。HotSpotJVM(JDK-8266074)热点/编译器中类层次分析的新实现HotSpotJVM中引入了类层次分析的新实现。它的特点是增强了对抽象方法和默认方法的处理,改进了JIT编译器做出的内联决策。新的实现取代了原来的并默认打开。为了帮助诊断新实现可能出现的问题,可以通过指定-XX:+UnlockDiagnosticVMOptions-XX:-UseVtableBasedCHA命令行标志来打开原始实现。在未来的版本中可能会删除原始实现。JEP391:macOS/AArch64端口(JDK-8251280)热点/编译器macOS11.0现在支持AArch64架构。这个JEP在JDK中实现了对macos-aarch64平台的支持。添加的功能之一是支持W^X(写异或执行)内存。它仅适用于macos-aarch64,并且可能会在某些时候扩展到其他平台。JDK可以在Intel计算机和基于AppleM1的计算机上交叉编译。有关详细信息,请参阅JEP391统一日志记录支持异步日志刷新(JDK-8229517)热点/运行时为了避免使用统一日志记录的线程出现意外延迟,用户现在可以请求统一日志记录系统以异步模式运行。这可以通过传递命令行选项-Xlog:async来完成。在异步日志模式下,日志站点将所有日志消息排入缓冲区。单独的线程负责将它们刷新到相应的输出。中间缓冲区是有界的。当缓冲区耗尽时,排队的消息将被丢弃。用户可以使用命令行选项-XX:AsyncLogBufferSize=。控制中间缓冲区的大小。ARM上的macOS早期访问可用(JDK-8266858)基础架构/构建新的macOS现在可用于ARM系统。ARM端口的行为应该类似于Intel端口。没有已知的功能差异。在macOS上报告问题时,请说明您使用的是ARM还是x64。支持在Keytool-genkeypair命令中指定签名者(JDK-8260693)security-libs/java.security-signer和-signerkeypass选项已添加到keytool实用程序的-genkeypair命令。-signer选项指定签名者私钥条目的密钥库别名,-signerkeypass选项指定用于保护签名者私钥的密码。这些选项允许keytool-genkey使用签名者的私钥对证书进行签名。这对于生成具有密钥协议算法作为公钥算法的证书特别有用。SunJCE提供程序支持使用AES密码的KW和KWP模式(JDK-8248268)security-libs/javax.cryptoSunJCE提供程序已得到增强以支持AES密钥包装算法(RFC3394)和具有填充算法的AES密钥包装算法(RFC5649)。在早期版本中,SunJCE提供程序在“AESWrap”密码算法下支持RFC3394,该算法只能用于包装和解包密钥。通过此增强功能,添加了两种块密码模式,KW和KWP,以支持使用AES进行数据加密/解密和密钥包装/解包。有关详细信息,请参阅“JDK提供程序文档”指南的“SunJCE提供程序”部分。新的SunPKCS11配置属性(JDK-8240256)security-libs/javax.crypto:pkcs11SunPKCS11提供程序添加了新的提供程序配置属性以更好地控制本机资源使用。SunPKCS11提供程序使用本机资源以便与本机PKCS11库一起使用。为了管理和更好地控制本机资源,添加了额外的配置属性来控制清除本机引用的频率,以及在注销后是否销毁底层PKCS11令牌。SunPKCS11提供程序配置文件的3个新属性是:destroyTokenAfterLogout(布尔值,默认为false)如果设置为true,当在SunPKCS11提供程序实例上调用java.security.AuthProvider.logout()时,底层令牌对象将被销毁并且资源将被释放。这基本上使SunPKCS11提供程序实例在logout()调用后不可用。请注意,不应将此属性设置为true的PKCS11提供程序添加到系统提供程序列表中,因为提供程序对象在logout()方法调用后不可用。cleaner.shortInterval(整数,默认为2000毫秒)这定义了本机引用在繁忙期间被清除的频率,即清洁线程应该多久处理一次队列中不再需要的本机引用以释放本机内存。请注意,清洁线程将在200次失败尝试后切换到“longInterval”频率,即当在队列中找不到引用时。cleaner.longInterval(integer,default60000inmilliseconds)这定义了在非繁忙期间检查原生refs的频率,即清洁线程应该多久检查一次队列中的原生refs。请注意,如果检测到用于清洁的本机PKCS11引用,则清洁器线程将切换回“短间隔”值。具有系统属性的可配置扩展(JDK-8217633)security-libs/javax.net.ssl添加了两个新的系统属性。系统属性jdk.tls.client.disableExts用于禁用客户端中使用的TLS扩展。系统属性jdk.tls.server.disableExts用于禁用服务器中使用的TLS扩展。如果禁用扩展,则不会在握手消息中生成或处理扩展。属性字符串是在IANA文档中注册的标准TLS扩展名称的逗号分隔列表(例如,server_name、status_request和signature_algorithms_cert)。请注意,扩展名区分大小写。忽略未知、不受支持、拼写错误和重复的TLS扩展名称标记。请注意,阻止TLS扩展的影响是复杂的。例如,如果禁用强制扩展,则可能无法建立TLS连接。请不要禁用强制扩展,除非您清楚地了解它的影响,否则不要使用此功能。包摘要页面上的“相关包”(JDK-8260388)tools/javadoc(tool)包的摘要页面现在包含一个列出所有“相关包”的部分。相关包是根据通用命名约定启发式确定的,可能包括以下内容:“父”包(即包是子包的包)兄弟包(即具有相同父包的其他包)任何子包相关包不一定都在同一个模块中。原文链接本文为阿里云原创内容,未经许可不得转载。