闪电下载吧 最新软件 免费软件 绿色软件

教程资讯 软件专题

您的位置:SD124 > 应用软件 > 编程开发 > Java SE Development Kit (JDK) 21.0.2 x64/Linux/macOS

Java SE Development Kit (JDK) 21.0.2 x64/Linux/macOS

  • 软件大小:167 MB
  • 更新日期:2024-01-17
  • 官方网站:闪电下载吧
  • 软件等级:★★★☆☆
  • 运行环境:Winxp/Win7/Win8/Win10
Java SE Development Kit (JDK) 21.0.2 x64/Linux/macOS
  • 软件说明
  • 软件截图
  • 下载地址
  • 相关软件
  • 用户评论
  • 投诉建议: 858898909@qq.com
Java SE Development Kit (JDK) 21.0是标准的java开发工具包软件!完整的工具和库来加速您所有的开发设计操作,提高效率,对过程中遇到的各种问题进行简化和能力的提升,满足用户日益增长的需求, 包括用于开发、测试和监视用 Java 编程语言编写并在 Java 平台上运行的程序的工具。开发任意的需求和要求与日俱增,为了迎接更高的挑战,减轻压力,提高用户体验,它也在逐步进行改进和增强,21.0进行了诸多的优化和新增,使用起来也更加得心应手,有需要的朋友不要错过了!

安装说明

1、下载并解压,如图所示

2、安装,安装目录

3、安装完成,根据提示进行后续设置

新版特色

一、21新功能
本节介绍 Java SE 21 和 JDK 21 中的一些增强功能。在某些情况下,说明提供了指向有关问题或更改的其他详细信息的链接。此处描述的 API 随 Oracle JDK 一起提供。它包括 Java SE 21 平台的完整实现和其他 Java API,以支持开发、调试和监视 Java 应用程序。有关Java SE 21和JDK 21中重要增强功能和新功能的另一个信息来源是Java SE 21(JSR 396)平台规范,它记录了Java SE 20和Java SE 21之间对规范所做的更改。本文档包括这些新功能和增强功能的说明,这些功能和增强功能也是对规范的更改。这些描述还标识了迁移到 JDK 21 时可能遇到的潜在兼容性问题。
 
core-libs/java.lang
➜ Runtime.exec 和 ProcessBuilder 命令参数日志记录 (JDK-8303392)
由 和 可以启用的进程来记录命令、参数、目录、堆栈跟踪和进程 ID。在实施之前,应审查这些信息的暴露情况。当指定的日志记录级别为 或 时,将启用信息的日志记录。启用 后,仅记录进程 ID、目录、命令和堆栈跟踪。启用 后,命令参数包含在进程 ID、目录、命令和堆栈跟踪中。Runtime.execProcessBuilderSystem#getLogger(String)java.lang.ProcessBuilderSystem.Logger.Level.DEBUGLogger.Level.TRACELevel.DEBUGLevel.TRACE
 
core-libs/java.lang
➜ System.exit() 和 Runtime.exit() 日志记录 (JDK-8301627)
对记录器的调用 和 记录到记录器,记录器以日志记录级别 命名。当记录器的配置允许时,可以从日志中包含的堆栈跟踪中识别调用方。java.lang.System.exit()Runtime.exit()java.lang.RuntimeSystem.Logger.DEBUG
 
core-libs/java.lang
➜ Math.clamp() 和 StrictMath.clamp() 方法 (JDK-8301226)
添加这些方法是为了方便地将数值夹在指定的最小值和最大值之间。在 、、 和 类型的 和 类中都提供了四个重载。重载也可用于安全地将值缩小到 。Math.clamp()StrictMath.clamp()MathStrictMathintlongfloatdoubleclamp(long value, int min, int max)longint
 
core-libs/java.lang
➜ 新的字符串 indexOf(int,int,int) 和 indexOf(String,int,int) 方法,以支持一系列索引 (JDK-8302590)
添加了两个新方法 和 ,以支持分别对字符 和 的正向搜索,并限制在指定的索引范围内。indexOf(int ch, int beginIndex, int endIndex)indexOf(String str, int beginIndex, int endIndex)java.lang.StringchStringstr
 
除了完全控制搜索范围外,它们分别比 和 更安全,因为它们在非法搜索范围上抛出异常。indexOf(int ch, int fromIndex)indexOf(String str, int fromIndex)
 
方法由 JDK-8302590 涵盖,方法由 JDK-8303648 涵盖。indexOf(int ch, int beginIndex, int endIndex)indexOf(String str, int beginIndex, int endIndex)
 
core-libs/java.lang
➜ 统一码表情符号属性 (JDK-8303018)
添加了以下六种新方法,用于获取技术标准(UTS #51)中定义的表情符号字符属性:java.lang.CharacterUnicode Emoji
 
isEmoji(int codePoint)
isEmojiPresentation(int codePoint)
isEmojiModifier(int codePoint)
isEmojiModifierBase(int codePoint)
isEmojiComponent(int codePoint)
isExtendedPictographic(int codePoint)
core-libs/java.lang
➜ 添加到字符串和java.util.regex.Pattern的新splitWithDelimiters()方法(JDK-8305486)
与方法不同,这些新方法在 和 返回字符串和匹配分隔符的交替,而不仅仅是字符串。split()splitWithDelimiters()java.lang.Stringjava.util.regex.Pattern
 
core-libs/java.net
➜ java.net.http.HttpClient 现在可以自动关闭 (JDK-8267140)
API 中添加了以下方法:
 
void close():正常关闭客户端,等待提交的请求完成。
void shutdown():启动正常关闭,然后立即返回,而无需等待客户端终止。
void shutdownNow():启动立即关机,尝试中断活动操作,并立即返回,而无需等待客户端终止。
boolean awaitTermination(Duration duration):在给定的持续时间内等待客户端终止;如果客户端终止,则返回 true,否则返回 false。
boolean isTerminated():如果客户端终止,则返回 true。
由 返回的实例和从 生成的实例为这些方法提供了尽力实现。它们允许回收早期分配的资源,而无需等待其垃圾收集。HttpClient.newHttpClient()HttpClient.newBuilder()HttpClient
 
请注意,实例通常管理自己的连接池,然后在必要时可以重复使用这些连接池。连接池通常不会在实例之间共享。为每个操作创建一个新客户端(尽管可能)通常会阻止重用此类连接。HttpClientHttpClient
 
core-libs/java.nio.charsets
➜ 支持 GB18030-2022 (JDK-8301119)
中国国家标准机构 (CESI) 最近发布了 GB18030-2022,这是 GB18030 标准的更新版本,GB18030与 Unicode 版本 11.0 同步。这个新标准的实施现在已经取代了以前的标准。但是,此新标准与以前的实现相比有一些不兼容的更改。对于那些需要使用旧映射的用户,引入了新的系统属性。通过将其值设置为 ,将使用基于标准的先前 JDK 发行版的映射。Charset2000jdk.charset.GB180302000GB18030 Charset2000
 
core-libs/java.util
➜ 新的 StringBuilder 和 StringBuffer 重复方法 (JDK-8302323)
这些方法已被添加到 和 以简化字符或字符串的多个副本的追加。例如,将在对象的值中插入 80 个连字符。public StringBuilder repeat(int codePoint, int count)public StringBuilder repeat(CharSequence cs, int count)java.lang.StringBuilderjava.lang.StringBuffersb.repeat('-', 80)java.lang.StringBuilder sb
 
core-libs/java.util.regex
➜ 正则表达式中与表情符号相关的二进制属性 (JDK-8305107)
(JDK-8303018) 中引入的与表情符号相关的属性现在可以用作类中的二进制属性。可以将具有表情符号相关属性的字符与新结构相匹配。例如java.util.regex.Pattern\p{IsXXX}
 
Pattern.compile("\\p{IsEmoji}").matcher("🉐").matches()
 
返回。true
 
core-libs/java.util:collections
➜ 序列集合 (JEP 431)
序列集合 API 在集合框架中引入了几个新接口,为许多现有集合类提供了增强功能。新的 API 有助于访问排序集合两端的元素,并提供以相反顺序查看和迭代此类集合的功能。有关更多信息,请参阅 JEP 431。
 
引入新的集合接口以及默认方法会带来一些兼容性风险,包括源和二进制不兼容的可能性。在接口层次结构中引入默认方法可能会导致与在扩展集合接口的现有类或接口上声明的方法发生冲突 - 这可能会导致源或二进制不兼容。新接口的引入也会在系统中引入新类型,这可能会改变类型推断的结果,进而导致源不兼容。
 
有关潜在不兼容性的讨论以及缓解这些不兼容性的可能方法,请参阅文档 JDK 21:排序集合不兼容性。
 
核心-SVC/工具
➜ 将代理加载到正在运行的虚拟机时打印警告 (JEP 451)
Java 虚拟机 (JVM) 现在会在将 JVM 工具接口 (JVM TI) 代理程序或 Java 代理程序动态加载到正在运行的 JVM 中时打印标准错误警告。该警告旨在为将来的版本做准备,该版本默认不允许将代理代码动态加载到正在运行的 JVM 中。
 
代理是在 JVM 进程中运行并利用强大的 JVM TI 或 API 的程序。这些 API 旨在支持探查器和调试器等工具。代理通过命令行选项(例如 或 )启动,也可以使用 JDK 特定的 API 或命令在正在运行的 VM 中启动。加载到正在运行的 VM 中的代理现在将打印警告。对于在启动时通过命令行选项加载的代理,没有警告。java.lang.instrument-agentlib-javaagentcom.sun.tools.attachjcmd
 
“热点虚拟机”选项控制代理的动态加载。此选项自 JDK 9 以来一直存在。自 JDK 9 以来,缺省值是允许动态加载代理。在命令行上运行 作为显式的“选择加入”,允许将代理代码加载到正在运行的 VM 中,从而禁止显示警告。使用代理代码运行不允许将代理代码加载到正在运行的 VM 中,并可用于测试将来可能的行为。EnableDynamicAgentLoading-XX:+EnableDynamicAgentLoading-XX:-EnableDynamicAgentLoading
 
此外,系统属性可用于跟踪 API 的使用情况。使用 API 运行或导致 API 的使用以打印跟踪消息和堆栈跟踪。这可用于标识动态加载的代理,而不是使用 在命令行上启动的代理。jdk.instrument.traceUsagejava.lang.instrument-Djdk.instrument.traceUsage-Djdk.instrument.traceUsage=true-javaagent
 
有关此更改的更多信息,请参阅JEP 451。
 
热点/GC
➜ 代代中关村 (JEP 439)
使用代际ZGC运行的应用程序应该享受:
 
降低分配停滞的风险,
降低所需的堆内存开销,以及
降低垃圾回收 CPU 开销。
使用命令行选项启用分代 ZGC-XX:+UseZGC -XX:+ZGenerational
 
有关更多详细信息,请参阅 JEP 439。
 
热点/GC
➜ 最后的手段 G1 全气相色谱移动巨大的物体 (JDK-8191565)
垃圾优先 (G1) 回收器中的完全垃圾回收 (GC) 现在会移动巨大的对象,以避免在应用程序分配巨型对象时由于 Java 堆中缺少连续空间而导致内存不足的情况。
 
以前,G1 无法分配这些巨大的对象,在这种情况下报告内存不足异常。
 
此功能是最后的手段,在上一个完整 GC 无法清除足够的连续内存以进行分配后,会导致第二个完整 GC 在同一暂停中出现。
 
热点/JFR
➜ 新的 JFR 视图命令 (JDK-8306703)
JFR 工具和 中新增了命令。该命令可以以表格形式聚合和显示事件数据,而无需转储记录文件或打开 JDK 任务控制。有 70 个预定义视图,例如 、 等。可以使用 或 找到可用视图的列表。viewjcmdhot-methodsgc-pausespinned-threadsallocation-by-sitegcmemory-leaks-by-classjcmd <pid> JFR.viewjfr view
 
security-libs/java.security
➜ 增强的 OCSP、证书和 CRL 提取超时 (JDK-8179502)
此功能为与证书、CRL 和 OCSP 连接和读取超时相关的属性提供了增强的语法。新语法允许以秒或毫秒为单位指定超时值。此功能还提供三个与连接和读取超时相关的新系统属性。
 
新媒体资源:现有媒体资源现在将与新媒体资源配对。前一个属性将用于设置传输层连接的超时,而后者将用于管理读取数据的超时。new 和 属性将分别用于在遵循 X.509 证书的 AuthorityInfoAccess 扩展时控制连接和读取超时。对于证书提取属性,必须将该属性设置为 才能进行提取并启用这些属性超时。com.sun.security.ocsp.timeoutcom.sun.security.ocsp.readtimeoutcom.sun.security.cert.timeoutcom.sun.security.cert.readtimeoutcom.sun.security.enableAIAcaIssuerstrue
 
增强的超时语法:新语法适用于上述属性,也适用于 and 属性。允许的语法如下:com.sun.security.crl.timeoutcom.sun.security.crl.readtimeout
 
十进制整数将在几秒钟内解释,并确保向后兼容性。
附加在后面的以“s”结尾的十进制整数(不区分大小写,无空格)。这也将在几秒钟内解释。
附加“ms”(不区分大小写,无空格)的十进制整数值。这将被解释为毫秒。例如,值“2500ms”将是 2.5 秒超时。
负值、非数字值或非十进制值(例如,以“0x”开头的十六进制值)将被解释为非法,并将默认为 15 秒超时。
无论以秒还是毫秒为单位解释该值,值为零都将禁用超时。
security-libs/java.security
➜ 支持HSS/LMS签名验证 (JDK-8298127)
引入了名为“HSS/LMS”的新标准签名算法。HSS/LMS 算法在 RFC 8554:Leighton-Micali 基于哈希的签名和 NIST 特别出版物 800-208 中定义。新的和实现可用于该算法。仅对公钥进行操作,仅涵盖验证部分。KeyFactorySignatureKeyFactorySignature
 
security-libs/javax.crypto
➜ SunJCE 提供程序现在支持 SHA-512/224 和 SHA-512/256 作为 PBES2 算法的摘要 (JDK-8288050 )
SunJCE 提供程序通过其他 PBES2 密码和 Mac 算法得到增强,例如使用 SHA-512/224 和 SHA-512/256 消息摘要的算法。更具体地说,调用方现在可以将 SunJCE 提供程序用于 、、、 和 密码以及 和 Mac。PBEWithHmacSHA512/224AndAES_128PBEWithHmacSHA512/256AndAES_128PBEWithHmacSHA512/224AndAES_256PBEWithHmacSHA512/256AndAES_256PBEWithHmacSHA512/224PBEWithHmacSHA512/256
 
security-libs/javax.crypto:pkcs11
➜ 在 SunPKCS11 中支持基于密码的加密 (JDK-8301553)
SunPKCS11 安全提供程序现在支持密码、Mac 和 SecretKeyFactory 服务类型的基于密码的加密算法。您将在 JDK-8308719 中找到算法列表。由于这种增强,SunPKCS11 现在可以用于 PKCS #12 密钥存储中的隐私和完整性。
 
security-libs/javax.xml.crypto
➜ 用于切换 XML 签名安全验证模式的新系统属性 (JDK-8301260)
添加了一个名为的新系统属性。它可用于启用或禁用 XML 签名安全验证模式。系统属性应设置为“true”以启用,或设置为“false”以禁用。系统属性的任何其他值都被视为“false”。如果设置了系统属性,它将取代属性值。org.jcp.xml.dsig.secureValidationXMLCryptoContext
 
默认情况下,安全验证模式处于启用状态。禁用安全验证模式的风险应由您自行承担。
 
security-libs/javax.xml.crypto
➜ 将 Java 的 XML 安全性更新到 3.0.2 (JDK-8305972)
XML 签名实现已更新到 Santuario 3.0.2。主要的新功能是对EdDSA的支持。一个区别是 JDK 默认情况下仍然支持 here() 函数。但是,我们建议避免在新签名中使用该函数,并替换使用该函数的现有签名。JDK 的未来版本可能会禁用并最终删除对此功能的支持,因为使用标准 Java XPath API 无法支持此功能。用户现在可以通过将安全属性设置为“false”来禁用该功能。here()here()here()jdk.xml.dsig.hereFunctionSupported
 
规范/语言
➜ 字符串模板(预览版)(JEP 430)
字符串模板允许在不使用运算符的情况下编写文本和表达式。结果通常是一个字符串,但也可以是其他类型的对象。每个字符串模板都有一个模板处理器,用于在编写文本和表达式之前对其进行验证,从而实现比其他语言中的基本“字符串插值”功能更高的安全性。+
 
规范/语言
➜ 未命名类和实例主方法(预览版)(JEP 445)
未命名的类和实例 main 方法使学生能够为单类程序编写简化的声明,然后在以后无缝扩展其程序,以便随着技能的增长使用更高级的功能。未命名的类允许用户提供类内容,而无需类声明的完整仪式。实例主方法功能允许用户放弃 的形式并简单地声明 .public static void main(String[] args)void main()
 
工具/javac
➜ 在构造函数中调用可重写方法时的新 javac 警告 (JDK-8015831)
添加了新的 lint 选项 ,以警告对构造函数主体中可重写方法的调用,这可能会导致从子类访问部分构造的对象。this-escapejavac
 
可以使用 抑制新警告。SuppressWarnings("this-escape")
 
工具/javac
➜ 在编译过程中覆盖输出文件时生成“输出文件冲突”警告 (JDK-8287885)
在 JDK 21 之前,编译器在编译期间覆盖了一些输出文件。例如,在不区分大小写的文件系统上,可能会发生这种情况。javac
 
从 JDK 21 开始,一个新的编译器选项: 已添加到编译器中。此新选项应为遇到此问题的用户提供一种方法,将当前运行时错误转换为编译时警告(或错误)。这个新的编译器选项启用输出文件冲突检测。术语“输出文件”涵盖类文件、源文件和本机头文件。-Xlint:output-file-clashjavac-Werror
 
tools/javadoc(tool)
➜ 支持在生成的文档中搜索章节标题 (JDK-8286470)
JavaDoc 生成的 API 文档现在支持在文档中搜索章节的标题。
 
工具/jshell
➜ JShell 中的 JDK 工具访问 (JDK-8306560)
用于交互式探索 Java 代码的 JShell 工具已通过新的预定义脚本 .该脚本提供从 JShell 中直接访问 JDK 的命令行工具,例如 、 和 。TOOLINGTOOLINGjavacjavadocjavap
 
与现有的预定义脚本和脚本类似,脚本可以在 JShell 启动时通过运行以下命令加载:。或者,可以使用以下命令在 JShell 会话中加载它: 。加载脚本后,可以通过向方法传递名称和参数来运行JDK工具。该方法打印可用工具的名称。DEFAULTPRINTINGTOOLINGjshell TOOLING/open TOOLINGTOOLINGrun(String name, String... args)tools()
 
该脚本为最常用的工具定义了方便的方法,例如 。下面是运行反汇编和打印类或接口概述的工具的示例:TOOLINGjavac(String... args)javap
 
jshell> interface Empty {}
 
jshell> javap(Empty.class)
工具/启动器
➜ -xshowSettings:locale 输出现在包括 tzdata 版本 (JDK-8305950 )
启动器选项已得到增强,可以打印使用 JDK 配置的 tzdata 版本。tzdata 版本显示为 showSettings 选项的一部分。-XshowSettingslocale
 
使用的示例输出:-X:showSettings:locale
 
.....
 
Locale settings:
    default locale = English
    default display locale = English
    default format locale = English
    tzdata version = 2023c
    .....
XML/JAXP
➜ 对 JAXP 配置文件的更改 (JDK-8303530)
对 JAXP 配置文件进行了以下更改:
 
将该文件作为缺省 JAXP 配置文件添加到 JDK 中。文件中的属性设置反映了 JDK 的当前内置默认值。jaxp.properties$JAVA_HOME/conf/jaxp.properties
 
添加了一个新的系统属性 ,用于指定自定义配置文件的位置。如果已设置并且命名文件存在,那么文件中包含的属性设置将覆盖缺省 JAXP 配置文件中的属性设置。有关更多详细信息,请参阅模块规范的配置部分。java.xml.config.file
 
已弃用在 StAX API 中定义并由 StAX 工厂使用的文件。在StAX集成到JAXP之后,它变得多余,因为JAXP配置文件已经完全涵盖了该功能。建议应用程序迁移到 JAXP 配置文件,因为该文件已弃用,将来可能不再受支持。stax.propertiesstax.properties
 
二、已删除的功能和选项
本节介绍在 Java SE 21 和 JDK 21 中删除的 API、功能和选项。描述的 API 以下是随 Oracle JDK 提供的那些。它包括Java SE 21平台的完整实现 以及其他 Java API,以支持开发、调试和监视 Java 应用程序。另一个来源 有关 Java SE 21 和 JDK 21 中重要增强功能和新功能的信息是 Java SE 21 (JSR 396) 平台规范,它 记录了在 Java SE 20 和 Java SE 21 之间对规范所做的更改。本文档包括 标识此处未描述的已删除 API 和功能。以下描述也可能确定 迁移到 JDK 21 时可能遇到的潜在兼容性问题。 有关在 JDK 21 中关闭的 CSR 列表,请参阅 JDK 21 批准的 CSR。
 
core-libs/java.io
➜ 删除 java.io.File 的规范路径缓存 (JDK-8300977)
java.io.File历来缓存了规范路径和部件路径,以帮助 和 在使用集合运行时的性能。缓存在具有符号链接的环境中存在正确性问题,并且自 JDK 12 以来默认处于禁用状态。此版本中已删除缓存以及系统属性和 .设置这些属性不再有任何效果。File::getCanonicalFileFile::getCanonicalPathSecurityManagersun.io.useCanonCachessun.io.useCanonPrefixCache
 
core-libs/java.lang
➜ 删除了线程组允许线程悬架 (JDK-8297295)
此版本已删除该方法。该方法在 JDK 1.1 中用于低内存处理,但从未完全指定。它在JDK 1.2(1998)中被弃用并更改为“不执行任何操作”。java.lang.ThreadGroup.allowThreadSuspension(boolean)
 
core-libs/java.lang
➜ 删除 java.compiler 系统属性 (JDK-8041676)
系统属性已从标准系统属性列表中删除。java.compiler
 
在命令行上设置此系统属性的情况下运行现在将打印一条警告,指出系统属性已过时;它没有其他效果。在以前的发行版中,使用或在命令行上运行时选择仅解释器执行模式。如果需要,该选项可用于在仅解释器模式下运行。-Djava.compiler-Djava.compiler=NONE-Xint
 
core-libs/java.lang
➜ 已删除 java.lang.Compiler 类 (JDK-8205129)
该类已被删除。此未指定 API 的日期来自 JDK 1.0 和早期 JDK 版本中使用的“经典虚拟机”。它在 HotSpot VM 中的实现只会打印一条警告,指出它不受支持。自 Java SE 9 以来,该类已被弃用并标记为删除。java.lang.Compiler
 
core-libs/java.util.jar
➜ 删除 JAR 索引功能 (JDK-8302819)
“JAR 索引”功能已从 JAR 文件规范中删除。JAR 索引是早期 JDK 版本中的遗留优化,允许在通过网络加载小程序或其他类时推迟下载 JAR 文件。自 JDK 18 以来,该功能已被禁用,这意味着在运行时忽略 JAR 文件中的条目。META-INF/INDEX.LIST
 
已删除 JDK 18 中引入的用于重新启用该功能的系统属性。设置此属性不再有任何效果。jdk.net.URLClassPath.enableJarIndex
 
作为更改的一部分,如果使用 or 选项,该工具现在将输出警告。jar-i--generate-index
 
core-svc/javax.management
➜ javax.management.remote.rmi.RMIIIOPServerImpl 被删除 (JDK-8307244)
该类已被删除。IIOP 传输已从 JDK 9 中的 JMX Remote API 中删除。自Java SE 9以来,此类已被弃用,其构造函数更改为throw。javax.management.remote.rmi.RMIIIOPServerImplUnsupportedOperationException
 
热点/GC
➜ 删除 G1 热卡缓存 (JDK-8225409)
G1 热卡缓存已被删除。性能测试表明,在改进并发细化控制后,它对性能没有贡献。
 
删除操作可将 G1 垃圾回收器的内存占用量减少约 Java 堆大小的 0.2%。
 
关联的配置选项已过时。如果使用这些选项,将在启动时发出有关这些选项的警告。G1ConcRSLogCacheSizeG1ConcRSHotCardLimit
 
热点/运行时
➜ 过时的传统热点并行类加载解决方法选项 -XX:+删除启用等待并行加载 (JDK-8298469 )
一些较旧的用户定义的类装入器会通过在装入过程中释放类装入器锁来解决死锁问题。为了防止这些加载程序在通过并行线程加载同一类时遇到问题,HotSpot 虚拟机在 JDK 6 中引入了一种解决方法,用于序列化加载尝试,从而导致后续尝试等待第一次尝试完成。java.lang.LinkageError: attempted duplicate class definition
 
在 JDK 7 中引入了支持并行的类装入器时,不再需要类装入器以这种方式工作,但解决方法仍保留在 VM 中。JDK 20 中已弃用该变通办法,并为依赖此旧行为的用户引入了该选项。此选项的默认值为关闭。-XX:+EnableWaitForParallelLoad
 
在 JDK 21 中,已删除选项 和支持它的代码。-XX:+EnableWaitForParallelLoad
 
有关更多详细信息,请参阅 CSR JDK-8304056。
 
热点/运行时
➜ 元空间回收策略标志已过时 (JDK-8302385)
存在用于在类卸载后微调元空间的内存回收行为的选项。在实践中,这效果有限,很少使用。MetaspaceReclaimPolicy
 
因此,该选项已经过时。它现在生成过时的警告并被忽略。
 
security-libs/java.security
➜ 已删除 SECOM 信任系统的 RootCA1 根证书 (JDK-8295894)
已从密钥库中删除 SECOM 信任系统中的以下根证书:cacerts
 
+ alias name "secomscrootca1 [jdk]"
 
  Distinguished Name: OU=Security Communication RootCA1, O=SECOM Trust.net, C=JP
 
security-libs/jdk.security
➜ 删除 ContentSigner API 和 jarsigner -altsigner 和 -altsignerpath 选项 (JDK-8303410)
jarsigner 选项和 已被删除,以及包中的底层 API。该机制在 JDK 9 中已弃用,并在 JDK 15 中标记为删除。-altsigner-altsignerpathContentSignercom.sun.jarsigner
三、已弃用的功能和选项
有关 Java SE 21 和 JDK 21 中不推荐使用的 API、功能和选项的其他信息来源包括:
 
“已弃用的 API”页标识 所有已弃用的 API,包括在 Java SE 21 中已弃用的 API。
Java SE 21 (JSR 396) 规范文档更改 Java SE 20 和 Java SE 21 之间制定的规范,包括已弃用 API 的标识 以及此处未描述的功能。
JEP 277:增强型弃用提供了 弃用策略。您应该了解本文档中描述的更新策略。
您应该了解这些文档中的内容以及本发行说明页面中描述的项目。
 
已弃用 API 的说明可能包括对 和 的弃用警告的引用。该文本指示已弃用的 API 可能会从下一个主要版本中删除。该文本指示已弃用的 API 预计不会从下一个主要版本中删除,但可能会在以后的某个版本中删除。forRemoval=trueforRemoval=falseforRemoval=trueforRemoval=false
 
以下说明还标识了迁移到 JDK 21.有关在 JDK 21 中关闭的 CSR 列表,请参阅 JDK 21 批准的 CSR。
 
client-libs/java.awt
➜ 弃用 GTK2 进行删除 (JDK-8280031)
在 Linux 上使用 GTK2 对 AWT/Swing 的实现支持现已弃用。
 
随着 4 年 2020 月发布 GTK2 的发布,GTK 2 工具包即将结束其生命周期。因此,预计在 JDK 支持的平台不需要它之后的一段时间内,GTK<> 支持将被移除。
 
GTK3 是当前的默认版本,通过设置系统属性选择在 Linux 上使用 GTK2 的 Swing 应用程序现在将看到打印以下警告:-Djdk.gtk.version=2
 
WARNING: the GTK 2 library is deprecated and its support will be removed in a future release.
 
core-libs/java.nio
➜ com.sun.nio.file.SensitivityWatchEventModifier 已弃用 (JDK-8303175)
com.sun.nio.file.SensitivityWatchEventModifier已弃用,并在将来的版本中标记为删除。此枚举中的常量与 macOS 上基于轮询的实现一起使用,以设置轮询文件以查找更改时的间隔。基于轮询的轮询已更改为在注册要监视的文件时忽略这些修饰符。WatchServiceWatchService
 
core-libs/java.util:i18n
➜ 发出删除兼容提供程序的警告 (JDK-8304982)
现在,如果用户使用 system 属性指定或区域设置数据并调用某些区分区域设置的操作,则会看到一条警告消息。 在 JDK 9 时提供用于迁移到区域设置数据,在那里它成为默认区域设置数据 (JEP 252)。JDK 21 保留了 JDK 8 的旧版语言环境数据以实现兼容性,但未应用某些较新的功能。旧版区域设置数据将在将来的版本中删除。建议用户迁移到区域设置数据。COMPATJREjava.locale.providersCOMPATCLDRCLDR
 
core-svc/javax.management
➜ 弃用 JMX 主题委托和 JMXConnector.getMBeanServerConnection(Subject) 方法删除 (JDK-8298966))
JMX 主题委派功能已弃用,并标记为在将来的发行版中删除。此功能由不推荐删除的方法启用。javax.management.remote.JMXConnector.getMBeanServerConnection(javax.security.auth.Subject)
 
如果客户端应用程序需要以多个标识的身份或代表多个标识执行操作,则需要对返回的方法进行多次调用。JMXConnectorFactory.connect()getMBeanServerConnection()JMXConnector
四、已知问题
以下说明描述了此版本中的已知问题或限制。
 
core-libs/java.util.jar
➜ 对 ZIP64 额外字段的验证 (JDK-8313765)
JDK 增强功能改进了对 zip 文件和 jar 文件中包含的 ZIP64 额外字段的验证。不满足这些新验证检查的文件可能会导致 .ZipException : Invalid CEN header (invalid zip64 extra data field size)
 
以下第三方工具已发布补丁,以更好地遵守 ZIP 文件格式规范:
 
空 CEN Zip64 的 Apache 共享资源压缩修复 共享资源压缩版本 1.11 中修复的额外标头
Ant 修复了空 CEN Zip64 在 Ant 1.10.14 中修复的额外标头
BND 中写入无效额外标头时的问题在 BND 5.3 中修复
maven-bundle-plugin 5.1.5 包含 BND 5.3 补丁。
如果这些改进的验证检查导致已部署的 zip 或 jar 文件出现问题,请检查文件的创建方式以及生成软件中是否有修补程序可用于解决问题。可以通过添加到运行时启动器参数来禁用新的验证检查。-Djdk.util.zip.disableZip64ExtraFieldValidation=true
 
在即将发布的 JDK 版本中,将对 zip 和 jar 文件中包含的 ZIP64 额外字段进行进一步修改。请参阅 JDK-8313765。
 
core-libs/java.util.regex
➜ java.util.regex.MatchResult 可能会在包含 lookfronts 和 lookbehinds 的正则表达式模式上抛出 StringIndexOutOfBoundsException (JDK-8132995)
JDK-8132995 在使用 返回的实例时引入了意外回归。java.util.regex.Matcher.toMatchResult()
 
这发生在包含前瞻和后视的 上,而后瞻又包含组。如果这些位于比赛之外,则会导致在访问这些组时投掷。有关示例,请参阅 JDK-8312976。java.util.regex.PatternStringIndexOutOfBoundsException
 
热点/编译器
➜ JVM在使用ZGC和非默认对象对齐字节(JDK-8312749)
运行非缺省值为 的 JVM 可能会导致 JVM 崩溃或不正确执行。此问题是由此配置的方法的 JIT 编译器优化不正确引起的。如果需要使用非默认值为 的 ZGC,可以使用命令行选项禁用 的 JIT 编译。-XX:+UseZGC-XX:ObjectAlignmentInBytesjava.lang.Object.clone()ObjectAlignmentInBytesjava.lang.Object.clone()-XX:+UnlockDiagnosticVMOptions -XX:DisableIntrinsic=_clone
 
热点/GC
➜ 如果虚拟机握手在内存上停止,则使用分代 ZGC 时 JVM 可能会挂起 (JDK-8311981)
JVM 可能会在一种罕见的情况下挂起,即 JVM 耗尽堆内存,GC 刚刚开始重新定位阶段以回收内存,以及 JVM 线程本地握手要求重新定位对象。
五、其他注意事项
以下说明描述了有关此版本的其他更改和信息。在某些情况下,以下说明提供了指向有关问题或更改的其他详细信息的链接。
 
client-libs/javax.swing
➜ 用于处理 HTML 对象视图创建的系统属性 (JDK-8296832(非公共))
某些显示应用程序文本的 Swing 组件(如 JLabels和 JButtons)将尝试将该文本解释为 HTML,主要是为了启用样式文本。这些组件的文本的 HTML 处理将不再识别允许在组件上呈现子类的标记。要重新启用此功能,应用程序必须指定 。<object>java.awt.Component-Dswing.html.object=true
 
core-libs/java.io
➜ 文件::列表根更改为返回 Windows 上所有可用的驱动器 (JDK-8208077)
在此版本中,Microsoft Windows 上的方法的行为已更改,因此返回的数组包含所有可用磁盘驱动器的对象。这与 JDK 10 到 JDK 20 中的行为不同,在 JDK <> 中,此方法筛选出无法访问或不存在介质的磁盘驱动器。此更改避免了在先前版本中观察到的性能问题,并确保该方法与 返回的小版本中的根目录一致。java.io.File.listRoots()FileFileSystem.getDefault().getRootDirectories()
 
core-libs/java.io:serialization
➜ ObjectInputStream::readObject() 应该处理负数组大小而不抛出负数组大小异常 (JDK-8306461)
ObjectInputStream::readObject()现在,从损坏的对象输入流中读取数组大小为负的数组时,会抛出 a 而不是 a。具有自定义方法的集合类以前在从反序列化流读取的元素数为负时抛出 a,现在将抛出 a 代替。StreamCorruptedExceptionNegativeArraySizeExceptionreadObject()NegativeArraySizeExceptionStreamCorruptedException
 
core-libs/java.lang
➜ Thread.sleep(millis, nanos) 现在能够执行亚毫秒级睡眠 (JDK-8305092)
该方法现在能够在POSIX平台上执行亚毫秒级睡眠。在此更改之前,非零参数将四舍五入为整毫秒。虽然大多数POSIX系统的精度有所提高,但实际睡眠持续时间仍取决于系统设施的精度和准确性。Thread.sleep(millis, nanos)nanos
 
core-libs/java.net
➜ Windows 上的新网络接口名称 (JDK-8302659)
执行网络多播或使用 API 的应用程序的维护者应注意,JDK 分配给 Windows 上的网络接口的名称在此版本中已更改。JDK历来综合了Windows上网络接口的名称。这已更改为使用 Windows 操作系统分配的名称。例如,JDK 可能历来为以太网接口分配了名称“eth0”,为环回分配了“lo”。Windows 分配的等效名称可能是“ethernet_32768”和“loopback_0”等名称。java.net.NetworkInterface
 
此更改可能会影响使用该方法查找网络接口的代码。使用 or 方法枚举所有网络接口的代码也可能令人惊讶,因为网络接口的名称看起来与以前的版本不同。根据配置,枚举所有网络接口可能会枚举以前未枚举的网络接口,因为它们没有分配 Internet 协议地址。返回的显示名称未更改,因此这应该有助于在使用 Windows 本机工具时识别网络接口。NetworkInterace.getByName(String name)NetworkInterfaces.networkInterfaces()NetworkInterface.getNetworkInterfaces()NetworkInterface::getDisplayName
 
core-libs/java.nio
➜ 文件通道传输自扩展文件(如果调用以将字节传输到文件)(JDK-8303260)
FileChannel.transferFrom已在此版本中进行了更改,以支持将字节从源通道传输到文件位置超出文件当前大小的文件。 之前指定为在文件位置大于文件当前大小时不传输任何字节。FileChannel.transferFrom
 
core-libs/java.nio.charsets
➜ 使用 file.encoding 阐明默认字符集初始化 (JDK-8300916)
如果在命令行上将系统属性设置为不在模块中的字符集的名称,则 JDK 将忽略它并默认为 UTF-8。在 JDK 17 及更早版本中,JDK 将尝试查找字符集,即使这些版本中从未支持或记录过它来更改此系统属性的值。从 JDK 18 开始,可以在命令行上将系统属性设置为值(缺省值)或 。未定义将其设置为任何其他值。file.encodingjava.baseUTF-8COMPAT
 
core-libs/java.text
➜ 支持排序规则设置的 Unicode 扩展 (JDK-8308108)
和排序规则设置的 BCP 47 Unicode 扩展现在在 中受支持。如果传递给工厂方法的区域设置包含和/或排序规则设置,则创建的实例将设置为具有与指定的强度和规范化设置相对应的强度和分解模式。strengthnormalizationjava.text.CollatorgetInstance(Locale)kskkCollator
 
core-libs/java.text
➜ 瑞典语排序规则 (JDK-8306927)
瑞典语排序规则已修改,以反映该语言的现代排序。瑞典语中的排序规则现在区分“v”和“w”以及按字母顺序排序。例如, 的排序方式与此更改相同,而以前排序为 。要指定旧排序规则,请在区域设置中使用 Unicode 标识符。有关更多详细信息,请参阅支持变体排序规则。{"wb", "va", "vc"}{"va", "vc", "wb"}{"va", "wb", "vc"}co
 
core-libs/java.text
➜ 支持变体排序规则 (JDK-8307547)
java.text.Collator现在支持一个区域设置的多个排序规则。如果运行时提供实现,则可以使用 Unicode 排序规则标识符指定排序规则的类型。例如,使用语言环境创建的实例,瑞典语中的传统排序规则,可以对字符串进行排序,处理和相同。Collatorsv-u-co-tradvw
 
core-libs/java.util
➜ java.util.Formatter 可能会在 double 和 float 上返回略有不同的结果 (JDK-8300869)
for 的实现和转换为十进制 (、、) 现在与 中的实现一致,后者在 JDK 19 中进行了更改。java.util.Formatterdoublefloat'e''E''f''g''G'Double.toString(double)
 
因此,在极少数情况下,结果可能与早期版本中的结果略有不同。
 
一个例子是 和 格式 .通过此更改,结果是 ,而早期版本产生 .但是,此值上格式的任何较小精度(例如,“%.15e”)都将产生彼此相等的结果。double2e23"%.16e"2.0000000000000000e+231.9999999999999998e+23
 
另一个例子是 和 格式 .新的结果是 ,但早期版本会生成 。double9.9e-324"%.2g"9.9e-324"1.0e-323"
 
core-libs/java.util.jar
➜ 改进了 ZIP64 额外字段验证 (JDK-8302483(非公共))
java.util.zip.ZipFile已更新,以在打开 ZIP 文件时提供对 ZIP64 额外字段的额外验证。通过将系统属性设置为 。jdk.util.zip.disableZip64ExtraFieldValidationtrue
 
core-libs/java.util:i18n
➜ 支持 CLDR 版本 43 (JDK-8296248)
基于 Unicode 联盟的 CLDR 的区域设置数据已升级到版本 43。JDK 语言环境数据现在使用 coverageLevels.txt,包括“基本”和更高级别的语言环境数据,以及先前 JDK 版本中已经存在的数据以实现兼容性。有关详细的区域设置数据更改,请参阅 Unicode 联盟的 CLDR 发行说明。
 
热点/JVMTI
➜ 未为虚拟线程发送 JVM TI 线程启动和线程结束事件 (JDK-8307399)
JVM 工具接口 (JVM TI) 代理的维护者应该注意,JVM TI 现在指定不为虚拟线程发送 和 事件。这与虚拟线程在 Java SE 19 和 Java SE 20 中作为预览功能时不同。当该功能处于预览状态时,即使未启用该功能,也会为虚拟线程发送这些事件。希望在虚拟线程启动或终止时收到通知的代理需要添加该功能并启用 和 事件。ThreadStartThreadEndcan_support_virtual_threadscan_support_virtual_threadsVirtualThreadStartVirtualThreadEnd
 
热点/运行时
➜ ASLR 支持 CDS 存档 (JDK-8294323(非公共))
从 2023 年 <> 月 CPU 开始,在启用了 ASLR(地址空间布局随机化)的操作系统上,CDS 存档将放置在操作系统选取的随机地址上。
 
此更改可能会对性能产生较小的影响:(a) 启动时间可能会增加,因为 JVM 需要修补 CDS 归档中的指针;(b) 内存使用量可能会增加,因为 CDS 归档文件使用的内存不再可跨进程共享。我们预计影响很小,因为这种增加应该只是整体应用程序使用量的一小部分。
 
在极少数情况下,您必须禁用 CDS 的 ASLR,您可以使用 JVM 标志 。不建议使用此类标志。-XX:+UnlockDiagnosticVMOptions -XX:ArchiveRelocationMode=0
 
热点/运行时
➜ JNI_GetCreatedJavaVMs方法现在将仅返回完全初始化的虚拟机 (JDK-8308341)
在以前的版本中,:JNI_GetCreatedJavaVMs
 
jint JNI_GetCreatedJavaVMs(JavaVM **vmBuf, jsize bufLen, jsize *nVMs);
 
可以通过数组返回一个仍在初始化过程中并且可能尚未准备好使用。现在已更改,因此它只会返回完全初始化的 VM。在尝试使用任何条目之前,程序员必须检查返回的 VM 数 in 是否大于零。JavaVMvmBufnVMsvmBuf
 
安装/安装
➜ Debian JDK 安装程序更改 (JDK-8284854 (非公开))
Oracle JDK Debian 软件包的安装目录已从 更改为 。/usr/lib/jvm/jdk-${FEATURE}/usr/lib/jvm/jdk-${FEATURE}-oracle-${ARCH}
 
Oracle JDK Debian 软件包注册为从命令行启动文件的解释器。jexec.jar
 
Oracle JDK Debian 软件包在目录中配置 Java Preferences API 的存储。/etc/.java/.systemPrefs
 
Oracle JDK Debian 软件包将 JDK 命令与该命令一起注册,并为该命令提供文件。update-alternatives/usr/lib/jvm/.jdk-${FEATURE}-oracle-${ARCH}.jinfoupdate-java-alternatives
 
security-libs/java.security
➜ 添加了 Certigna(Dhimyotis) CA 证书 (JDK-8245654))
以下根证书已添加到 cacerts 信任库:
 
+ Certigna (Dhimyotis)
 
  + certignaca
    DN: CN=Certigna, O=Dhimyotis, C=FR
security-libs/java.security
➜ Microsoft公司的 2 个 TLS 根 CA 证书 (JDK-8304760) 添加)
以下根证书已添加到 cacerts 信任库:
 
+ Microsoft Corporation
 
  + microsoftecc2017
    DN: CN=Microsoft ECC Root Certificate Authority 2017, O=Microsoft Corporation, C=US
 
+ Microsoft Corporation
  + microsoftrsa2017
    DN: CN=Microsoft RSA Root Certificate Authority 2017, O=Microsoft Corporation, C=US
security-libs/java.security
➜ 添加了 TWCA 根 CA 证书 (JDK-8305975)
以下根证书已添加到 cacerts 信任库:
 
+ TWCA
 
  + twcaglobalrootca
    DN: CN=TWCA Global Root CA, OU=Root CA, O=TAIWAN-CA, C=TW
security-libs/java.security
➜ 添加了 4 个 GTS 根 CA 证书 (JDK-8307134)
以下根证书已添加到 cacerts 信任库:
 
+ Google Trust Services LLC
 
 + gtsrootcar1
  DN: CN=GTS Root R1, O=Google Trust Services LLC, C=US
 
+ Google Trust Services LLC
 + gtsrootcar2
  DN: CN=GTS Root R2, O=Google Trust Services LLC, C=US
 
+ Google Trust Services LLC
 + gtsrootecccar3
  DN: CN=GTS Root R3, O=Google Trust Services LLC, C=US
 
+ Google Trust Services LLC
 + gtsrootecccar4
  DN: CN=GTS Root R4, O=Google Trust Services LLC, C=US
security-libs/java.security
➜ 将最终关键字添加到某些静态方法 (JDK-8302696)
将关键字添加到静态 和方法中。finaljava.security.cert.CertStore::getDefaultType()javax.net.ssl.KeyManagerFactory::getDefaultAlgorithm()javax.net.ssl.TrustManagerFactory::getDefaultAlgorithm()
 
这将还原在 JDK 19 和 JDK 20 中所做的更改。
 
security-libs/java.security
➜ keytool -genseckey 和 -importpass 命令在使用弱 PBE 算法时发出警告 (JDK-8286907)
和命令已更新,以便在该选项指定基于密码的弱加密算法时警告用户。keytool-genseckey-importpass-keyalg
 
security-libs/java.security
➜ 用于控制签名文件最大大小的新系统属性 (JDK-8300596(非公共))
添加了一个新的系统属性 ,以允许应用程序控制已签名 JAR 中签名文件的最大大小。系统属性的值是所需的大小(以字节为单位)。默认值为 8000000 字节。jdk.jar.maxSignatureFileSize
 
security-libs/javax.crypto:pkcs11
➜ SunPKCS11 提供程序现在使用与其他 JDK 提供程序相同的 DH 专用指数长度 (JDK-8295425)
使用参数初始化 SunPKCS11 提供程序的 DH 实现时,它会查找默认 DH 参数(包括其他 JDK 提供程序使用的默认私有指数长度),以初始化基础本机 PKCS11 实现。如果使用具有负私有指数长度的对象初始化实现,则此无效的负值也将使用与 DH 素数大小匹配的默认值覆盖。KeyPairGeneratorkeysizeKeyPairGeneratorDHParameterSpec
 
security-libs/javax.net.ssl
➜ 默认 TLS Diffie-Hellman 组大小已从 1024 位增加到 2048 位 (JDK-8301700)
TLS 1.2 的 JDK 实现现在在协商TLS_DHE密码套件时使用 2048 位的默认 Diffie Hellman 密钥大小,并且客户端或服务器不支持 FFDHE,这可以协商更强的密钥大小。JDK TLS 实现支持 FFDHE,默认情况下处于启用状态。
 
作为一种解决方法,用户可以通过将系统属性设置为 1024 来恢复到以前的大小(风险自负)。jdk.tls.ephemeralDHKeySize
 
此更改不会影响 TLS 1.3,因为最小 DH 组大小已为 2048 位。
 
工具/javac
➜ javac 消息(如果使用隐式注释处理器)(JDK-8310061)
默认情况下启用批注处理依据,包括不存在批注处理配置选项时。默认情况下,隐式注释处理可能会在将来的版本中禁用,最早可能在 JDK 22 中禁用。为了提醒用户这种可能性,如果在使用隐式注释处理,则在 JDK 21 中打印注释。注释的正文是:javacjavacjavac
 
Annotation processing is enabled because one or more processors were found on the class path. A future release of javac may disable annotation processing unless at least one processor is specified by name (-processor), or a search path is specified (--processor-path, --processor-module-path), or annotation processing is enabled explicitly (-proc:only, -proc:full).
Use -Xlint:-options to suppress this message.
Use -proc:none to disable annotation processing.
 
良好的构建卫生包括显式配置注释处理。为了便于将来过渡到不同的缺省策略,JDK-21 中的新选项请求在类路径上查找注释处理器的当前缺省行为。-proc:fulljavac
 
工具/javac
➜ 检测输出文件冲突 (JDK-8296656)
新的编译器 lint 标志 可用于检测输出文件冲突。输出文件冲突是指编译器打算写入两个不同的输出文件,但由于操作系统的行为,这些文件最终会写入同一个基础文件。output-file-clash
 
这通常是由于不区分大小写的文件系统而发生的。例如,像这样的类会导致将两个类文件写入同一个文件:Test$Inner.class
 
public class Test {
 
    class Inner {
    }
    class INNER {
    }
}
 
但是,当文件系统“规范化”文件名时,也会发生此问题。例如,在 macOS 上,编译此类将生成这样的冲突:
 
public class Test {
 
    interface Cafe\u0301 {
    }
    interface Caf\u00e9 {
    }
}
 
原因是Unicode字符“组合急性重音”,意思是“在前一个字符上添加重音”。MacOS将字母后跟a规范化为Unicode,即。但是,Java 语言将这两个名称视为不同的名称。\u0301e\u0301\u00e9éCafe\u0301Caf\u00e9
 
在 macOS 上编译上面的示例现在将生成如下警告:-Xlint:output-file-clash
 
    warning: [output-file-clash] output file written more than once: /home/test/Test$Café.class
 
工具/javac
➜ 为继承的方法生成“潜在不明确的重载”警告 (JDK-8026369)
在 JDK 21 之前,编译器省略了该选项启用的一些“可能不明确的重载”警告。javac-Xlint:overloads
 
如果启用该选项,编译器会在类中的方法对包含隐式 lambda 表达式参数(如 )的方法调用产生潜在的多义性时发出警告。如果两个或多个方法可以匹配此类方法调用,则可能会出现歧义,例如当一个方法采用参数而另一个方法采用 .例如,编译器应针对以下代码发出警告:-Xlint:overloadsx -> { ... }Consumer<Integer>IntConsumerjavac
 
    interface I {
 
        void foo(Consumer<Integer> c);
        void foo(IntConsumer c);
    }
 
在 JDK 21 之前,仅当类中声明了其中一个方法时,才会为该类发出警告。编译器现在还会在类中声明这两个方法时发出警告。也就是说,这两种方法都是从超类型继承而来的。例如,对于以下代码:javac
 
    interface I {
 
        void foo(Consumer<Integer> c);
    }
 
    interface J {
        void foo(IntConsumer c);
    }
 
    interface K extends I, J {}
工具/javac
➜ 默认情况下发出合成和强制参数标志 (JDK-8292275)
在 JDK 21 之前,编译器并不总是将方法参数标记为或何时适用。从 JDK 21 开始,编译器在适用时发出类文件中的属性。此属性存储有关参数是否为 或 的信息。此更改适用于 支持的所有发行版和目标版本,因为当前支持的所有版本和目标都定义了该属性。javacsyntheticmandatedjavacMethodParameterssyntheticmandatedjavacMethodParameters
 
JLS § 13.1 证明此更改是合理的,特别是:
 
A binary representation for a class or interface must also contain all of the following:
 
 
[...]
 
11. A construct emitted by a Java compiler must be marked as synthetic if it does not
    correspond to a construct declared explicitly or implicitly in source code, unless
    the emitted construct is a class initialization method (JVMS §2.9).
12. A construct emitted by a Java compiler must be marked as mandated if it corresponds
    to a formal parameter declared implicitly in source code (§8.8.1, §8.8.9, §8.9.3,
    §15.9.5.1).
工具/javac
➜ 没有@Target注释的注释应适用于类型参数声明 (JDK-8303784)
在 JDK 21 之前,编译器不允许将没有批注的注解应用于类型参数声明。javac@Target
 
这是 JDK21 之前版本中编译器中的一个错误。JLS 9.6.4.1 指定没有注释的注释适用于“所有声明上下文”,其中包括类型参数声明。javac@Target
 
从 JDK21 开始,编译器将接受如下代码:javac
 
import java.lang.annotation.Retention;
 
import java.lang.annotation.RetentionPolicy;
 
@Retention(RetentionPolicy.RUNTIME)
@interface Anno {}
 
class C<@Anno T> {}
 
此更改会影响面向 / 14 及更高版本的编辑区。-source--release

有任何意见或者建议请联系邮箱:858898909[at]qq.com 本站部分内容收集于互联网,如果有侵权内容、不妥之处,请联系我们删除。敬请谅解!
Copyright © 2012 SDBETA.com. All Rights Reserved 豫ICP备12021367号 豫公网安备 41019702002546号闪电下载吧