Java 10 正式发布!时隔 6 月带来 109 项新特性

按照 JVM 标准返回此堆栈帧所代表的方法的描述符。

String getMethodType():

返回此堆栈帧所代表的方法类型,描述参数类型和返回值类型。

java.lang.invoke.MethodType:Class> lastParameterType():

返回这个方法类型的最后一个参数类型。如果这个方法类型没有参数,则返回空类型作为岗哨值(Sentinel Value)。

java.lang.management.RuntimeMXBean:long getPid():

R 返回正在运行的 JVM 的进程 ID 。

java.lang.management.ThreadMXBean:ThreadInfo[] dumpAllThreads(boolean, boolean, int):

返回所有活动线程的线程信息,其中有指定的最大元素数量和同步信息的堆栈跟踪。

ThreadInfo[] getThreadInfo(long[], boolean, boolean, int): 

返回每个线程的线程信息,这些线程的标识位于输入数组中,其中有指定的最大元素数量和同步信息的堆栈跟踪。

java.lang.reflect.MalformedParameterizedTypeException: 

添加了一个新的构造函数,它以字符串的形式作为参数来获取详细信息。

java.net.URLDecoder:java.net.URLEncoder:

这两个类都有新的重载的解码和编码方法,将 charset 作为附加参数。

java.nio.channels.Channels:

两个新的静态重载方法,允许使用 Charset 的 newReader(ReadByteChannel,Charset)和newWriter(WriteByteChannel,Charset)。

java.nio.file.FileStore:long getBlockSize(): 

在这个文件存储中返回每个块的字数。

java.time.chrono: 

这个包里有三个类,HijrahEra、MiinguoEra 和 ThaiBuddhistEra ,都有同样的方法。

String getDisplayName(TextStyle, Locale): 

这将返回用于识别 era 的文本名称,适合于向用户展示。

java.time.format.DateTimeFormatter:localizedBy(Locale): 

返回指定格式器的一个副本,其中包含地区、日历、区域、小数和/或时区的本地化值,这将取代该格式器中的值。

java.util:

DoubleSummaryStatistics、IntSummaryStatistics 和 LongSummaryStatistics 都有一个新的构造函数,它包含 4 个数值。它使用指定的计数、最小值、最大值和总和构造一个非空实例。

java.util.List:java.util.Map:java.util.Set:

这些接口中的每一个都增加了一个新的静态方法,copyOf(Collection)。这些函数按照其迭代顺序返回一个不可修改的列表、映射或包含给定集合的元素的集合。

java.util.Optional:java.util.OptionalDouble:java.util.OptionalInt:java.util.OptionalLong:

每一个类都有一个新的方法,orElseThrow() ,它本质上和 get() 一样,也就是说,如果 Optional 有值则返回。否则,将抛出 NoSuchElementException 。

java.util.Formatter:java.util.Scanner:

这两个类都有三个新的构造函数,除了其他参数之外,它们都带有一个 charset 参数。

java.util.Properties: 

这有一个新的构造函数,它接受一个 int 参数。这将创建一个没有默认值的空属性列表,并且指定初始大小以容纳指定的元素数量,而无需动态调整大小。还有一个新的重载的 replace 方法,接受三个 Object 参数并返回一个布尔值。只有在当前映射到指定值时,才会替换指定键的条目。

java.SplittableRandom:void nextBytes(byte[]):

用生成的伪随机字节填充一个用户提供的字节数组。

java.util.concurrent.FutureTask: 

添加了 toString() 方法,该方法返回一个标识 FutureTask 的字符串,以及它的完成状态。在括号中,状态包含如下字符串中的一个,“Completed Normally” 、“Completed Exceptionally”、 “Cancelled” 或者 “Not completed”。

java.util.concurrent.locks.StampedLock:boolean isLockStamp(long):

返回一个标记戳表示是否持有一个锁。

boolean isOptimisticReadStamp(long): 

返回一个标记戳代表是否成功的进行了乐观读(optimistic read)。

boolean isReadLockStamp(long): 

返回一个标记戳表示是否持有一个非独占锁(即 read lock )。

boolean isWriteLockStamp(long): 

返回一个标记戳表示是否持有一个独占锁(即 write lock )。

java.jar.JarEntry:String getRealName():

返回这个 JarEntry 的真实名称。如果这个 JarEntry 是一个多版本 jar 文件的入口,它被配置为这样处理,这个方法返回的名字是 JarEntry 所代表的版本条目的入口,而不是 ZipEntry.getName() 返回的基本条目的路径名。如果 JarEntry 不代表一个多版本 jar 文件的版本化条目或者 jar 文件没有被配置为作为一个多版本 jar 文件进行处理,这个方法将返回与 ZipEntry.getName() 返回的相同名称。

java.util.jar.JarFile:Stream versionedStream():

返回 jar 文件中指定版本的入口对应 Stream 。与 JarEntry 的 getRealName 方法类似,这与多版本 jar 文件有关。

java.util.spi.LocaleNameProvider:getDisplayUnicodeExtensionKey(String, Locale): 

为给定的 Unicode 扩展键返回一个本地化名称。

getDisplayUnicodeExtensionType(String, String, Locale): 

为给定的 Unicode 扩展键返回一个本地化名称。

java.util.stream.Collectors:toUnmodifiableList():toUnmodifiableSet():toUnmodifiableMap(Function, Function):toUnmodifiableMap(Function, Function, BinaryOperator):

这四个新方法都返回 Collectors ,将输入元素聚集到适当的不可修改的集合中。

java.lang.model.SourceVersion: 

现在有了一个字段,它代表了 JDK 10 的版本。

java.lang.model.util.TypeKindVisitor6:javax.lang.model.util.TypeKindVisitor9:

(我必须承认,我从来没听说过这些类)

R visitNoTypeAsModule(NoType, P): 

访问一个 MODULE 的 pseudo-type 。我不确定为什么只有这两个类得到这个方法,因为还有 Visitor7 和 Visitor8 变量。

javax.remote.management.rmi.RMIConnectorServer:

这个类已经添加了两个字段: CREDENTIALS_FILTER_PATTERN 和 SERIAL_FILTER_PATTERN 。

javax.ButtonModel:

看,Swing 还在更新!

ButtonGroup getGroup(): 

返回按钮所属的组。通常用于单选按钮,它们在组中是互斥的。

javax.plaf.basic.BasicMenuUI:Dimension getMinimumSize(JComponent):

返回指定组件适合观感的最小大小。

JVM 规范改动

这些改动相当小:

  • 4.6 节:类文件格式(第 99 页),在方法访问标志方面有小的改动。

  • 4.7 节:模块属性(第 169 页),如果模块不是 java.base ,则 JDK 10 不再允许设置 ACC_TRANSITIVE 或 ACC_STATIC_PHASE 。

  • 4.10 节:类文件的校验(第 252 页),dup2 指令已改变了 typesafe form 1 的定义,颠倒了 canSafleyPushList 一节中类型的顺序(你需要仔细查看才能发现它)。

  • 5.2 节:Java 虚拟机启动(第 350 页),该描述添加了在创建初始类或接口时可使用用户定义的类加载器( bootstrap 类加载器除外)。

这里还有一些更改,但主要是为了支持局部变量类型推断:

  • 3.8 节:标识符(第 23 页),在忽略了可忽略的字符之后,标识符的等价性现在被考虑了,这似乎是合乎逻辑的。

  • 4.10.5 节:类型预测(第 76 页),这是一个相当复杂的部分,它涉及到捕获变量、嵌套类以及如何使用局部变量类型推断。我建议你阅读规范中的这一部分,而不是试图解释它。

  • 6.5 节:确定名字的含义(第 153 页,第 158 页和第 159 页),根据类型标识符的使用而更改类类型。

  • 6.5.4.1 节:简单的 PackageOrTypeNames(第 160 页)。

  • 6.5.4.2节:合规的 PackageOrTypeNames(第 160 页),这两种方式都与使用 TypeIdentifier 有细微的变化。

  • 9.7.4 节:注释可能出现的地方(第 335 页),有一个与局部变量类型推断相关的变更。

  • 14 节:增强的 for 语句(第 455 页),这个结构已经更新,包括对局部变量类型推断的支持。

  • 14.20.3 节:try-with-resources(474 页),这个结构已经更新,包括对局部变量类型推断的支持。

最后,第 19 章有多处语法更新,反映了应更多使用 TypeIdentifier 类型标识符,而不仅仅是 Identifier 标识符,以支持局部变量类型推断。

其他更新内容

  • 如果 Kerberos 的配置文件 krb5.conf 包含一个 INCLUDEDIR 选项,那么在 INCLUDEDIR 这个目录下所有以 .conf 结尾的文件都会被默认加载进来。

  • 以前版本中已经过期的 Java 的启动选项 -d32 和 –d64 在当前版本已经被移除。如果你在新的版本里仍然使用了这两个选项,JVM 将无法正常启动。

  • JDK 10 支持 JDK 9 中的新版本 Doclet,JDK 6、JDK 7、JDK 8 中的 Doclet 版本都不再支持。

  • JDK 10 重新启用了在 JDK 9 中被不当过时的 newFactory() 方法。

  • JDK 10 引入了一个新的 Javadoc 标签: {@summary…},解决了以前版本无法生成 API 摘要的问题。

  • JDK 10 去掉了 BiasedLockingStartupDelay 的 4 秒启动延时。

  • 以下在 com.sun.security.auth 包中的过时的类在新版本中都已经被移除:

    PolicyFile

    SolarisNumericGroupPrincipal

    SolarisNumericUserPrincipal

    X500Principal

    SolarisLoginModule

    SolarisSystem

  • 在 java.lang.SecurityManager 类中的以下属性和方法(从 JDK 1.2 就已经过时)终于被移除了:

    inCheck (属性)

    getInCheck

    classDepth

    classLoaderDepth

    currentClassLoader

    currentLoadedClass

    inClass

    inClassLoader

  • 以下 java.lang.Runtime 类中已经被废弃的国际化方法在新版本被移除:

    getLocalizedInputStream

    getLocalizedOutputStream

  • 以下废弃的 Hotspot –X 选项在新版本中被移除:

    -Xoss

    -Xsqnopause

    Xoptimize

    -Xboundthreads

    –Xusealtsigs

  • policytool 在新版本中被移除。

  • javadoc 工具在新版本中可以通过 –add-stylesheets 命令选项支持多个 stylesheets 。

  • 新版本的 JVM 能够根据系统分配给当前 Docker 容器的 CPU 数和内存来配置线程池和 GC 机制,而不再是直接使用系统的 CPU 和内存。并且增加了三个更强大的命令选项:

    -XX:InitialRAMPercentage

    -XX:MaxRAMPercentage

    -XX:MinRAMPercentage

  • 新版本增加了一个新的系统属性:jdk.disableLastUsageTracking。这个新增的属性就像它的名字一样,会禁用 JRE 的上一次使用跟踪。

如上所述,尽管距离 JDK 9 发布仅六个月的时间,但 JDK 10 实际上有相当多的变化。当然,它们中的一些是非常小的变更,但我认为这表明目前每 6 个月发布一次的节奏,将在 Java 平台快速迭代改进方面起到作用,同时也让我们期待 JDK 11 将带来的内容。


分享到:


相關文章: