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 將帶來的內容。


分享到:


相關文章: