Java 9 – 你需要知道的關於新 Java 特性的一切
已發表: 2018-04-24Java 是一種高度可訪問的編程語言,它對全球的開發人員來說是一件輕而易舉的事。 自 1995 年問世以來,該語言已在各個行業廣泛使用。
今天,您將在手機上找到 Java。 為 Android 操作系統和 Android 提供的眾多應用程序提供支持。 它用於開發像 Minecraft 這樣擁有龐大玩家基礎的遊戲。 它還可以用於商業應用程序,例如在收銀台讀取信用卡信息以及在系統和銀行之間提供信息。
時隔 3 年,Java 推出了它的新版本——Java SE 9。Java SE 9 通過幾個關鍵的架構更改和附加功能,提供了開發人員一直渴望的強大解決方案。
Java 7 在 2011 年添加了 try-with-resource,提供了更好的資源管理功能。
Java 8 添加了 lambda 表達式,這是一個不錯的舉措,但在 OOP 範式下略有缺陷。
現在Java 解決方案允許程序員擁有私有方法。 私有靜態方法! 是的,你沒有看錯!
Java SE 8 提供了許多結構上的變化,開發人員對此反應不一。 主要是 Java SE 9 試圖克服的 Java SE 8 的缺點:
- JDK 不適用於小型計算設備
- 應用程序性能沒有整體提升
- JDK沒有整體的安全和維護
- Java 開發人員面臨構建和維護代碼庫和更大應用程序的困難
那麼,讓我們看一下 Java 9 相對於其前身提供的主要變化和增強功能
在 Java 9 中處理 API 更新
傳統上,Java 的 API 在本質上是原始的。 支持啟動新進程、重定向輸出和錯誤流。 在 Java 9 中,對 Process API 的新更新支持:
- 獲取當前和任何其他 JVM 進程的 PID
- 管理子流程
- 管理子流程
- 獲取系統中運行的進程的PID、名稱、資源使用情況等信息。
這是一個示例代碼,它打印當前 PID 以及當前進程信息:
public class NewFeatures
{
public static void main(String [] args)
{
ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("PID:"+ currentProcess.getPid());
ProcessHandle.Info currentProcessInfo = currentProcess.info();
System.out.println("Info:" + currentProcessInfo);
}
}
Java 9 中的 HTTP/2 客戶端
預計此功能將在後續版本中進行改革,甚至可能完全刪除。
以前開發人員會依賴第三方庫,例如 Apache HTTP、Jersey 等等。 Java 的 HTTP API 早於 HTTP/1.1 規範,並且是同步的且難以維護。 這些限制要求需要添加新的 API。 新的 HTTP 客戶端 API 提供以下功能:
- 處理大多數 HTTP 請求的簡單而簡潔的 API
- 支持 HTTP/2 規範
- 更好的性能
- 更好的安全性
- 更多增強功能
這是使用新 API 發出 HTTP GET 請求的代碼片段。 這是文件 module-info.java 中定義的模塊:
module newfeatures{
requires jdk.incubator.httpclient;
}
以下代碼使用 HTTP 客戶端 API。 這是jdk.incubator.httpclient模塊的一部分:
import jdk.incubator.http.*;
import java.net.URI;
public class Http2Feature{
public static void main(String[] args) throws Exception{
HttpClient client = HttpClient.newBuilder().build();
HttpRequest request = HttpRequest
.newBuilder(new URI(http://httpbin.org/get;))
.GET()
.version(HttpClient.Version.HTTP_1_1)
.build();
HttpResponse.String response = client.send(request,
HttpResponse.BodyHandler.asString());
System.out.println("Status code:" + response.statusCode());
System.out.println("Response Body:" + response.body());
}
}
}
Java 9 中的更多並發更新功能

在 Java 9 中,引入了一個名為 java.util.concurrent.Flow 的新類,它支持發布-訂閱框架的實現。 該框架使開發人員能夠構建組件。 這些組件可以通過設置生成數據的發布者和使用數據的訂閱者來異步使用實時數據流。 這些是新的接口:
- java.util.concurrent.Flow.Publisher
- java.util.concurrent.Flow.Subscriber
- java.util.concurrent.Flow.Subscription
- java.util.concurrent.Flow.Processor(同時充當發布者和訂閱者)。
Java 9 中的 Java Shell 腳本(讀取-評估-打印-循環)
Kulla 項目的目標是研究為 Java 9 添加的 REPL(Read-Eval-Print-Loop)工具。此 Java 版本具有一個名為 JShell 的特殊命令行工具。 這裡的目標是普及和最大化 REPL 的使用。 那麼,這意味著什麼? 現在,您無需將幾行代碼包裝在單獨的方法中即可運行它們。 高效的? 我說是。
例如,在 Scala 中,一個簡單的 Hello World 程序編寫為 scala>println(“Hello World”);
讓我們運行 JShell 命令,如下圖所示:
Java 9 中的拼圖項目
Java 9 中新特性的王牌是全新的模塊系統。 創建複雜系統通常涉及高級別的複雜代碼,這會導致歧義。 由於代碼複雜性,面臨兩個基本問題: 代碼封裝困難,系統的不同 JAR 文件之間沒有顯式依賴的概念。 每個公共類都可以被類路徑上的任何其他公共類訪問。 這會導致不必要地使用不屬於公共 API 的類。 此外,類路徑本身也存在問題:您如何知道是否所有必需的 JAR 都在那裡,以及重複的條目呢? 模塊系統解決了這兩個問題。
這就是 Java 9 的健壯性的體現。 模塊化 JAR 文件包含一個附加的模塊描述符。 在這個模塊描述符中,`requires` 語句用於表達對其他模塊的依賴。 此外,“exports”語句控制不同模塊可以訪問哪些包。 默認情況下,所有未導出的包都封裝在模塊中。
有各種 JEP,它們是該項目的一部分,如下所示:
JEP 200 – 模塊化 JDK:這應用 Java 平台模塊系統來模塊化可以在編譯時、構建時或運行時組合的 JDK。
JEP 201 – 模塊化源代碼:用於創建模塊並允許構建工具編譯創建的模塊
JEP 220 – 模塊化運行時映像:此 JEP 通過重組 JDK 和 JRE 運行時映像以適應模塊來提高性能、安全性和可維護性
JEP 282 – jlink,稱為 Java 鏈接器:用作打包模塊及其依賴項到更少的運行時間。
多版本 JAR 文件
為了在較新版本上利用 Java 平台的新特性,庫開發人員必鬚髮布其庫的較新版本。 很快,開發人員將維護該庫的多個版本,這可能是災難性的。 為了克服這個限制,Java 9 提供了 JAR 文件的多版本功能,允許開發人員為不同的 Java 版本構建具有不同版本的類文件的 JAR 文件。 看看這個例子。
當前 JAR 文件的圖示如下:
罐子根
- 一類
– B類
– C.類
以下是多版本 JAR 文件的外觀:
罐子根
- 一類
– B類
– C.類
– 元信息
– 版本
– – 9
- - - - 一類
– – 10
– – – – B.class
在上圖中,JAR 文件支持兩個 Java 版本 9 和 10 的類文件。因此,當在 Java 版本 9 上執行 JAR 時,將選擇 versions-9 文件夾下的 A.class 執行。
不支持多版本 JAR 文件的 Java 早期版本,versions 目錄下的類從不使用。 因此,如果您在 Java 8 上運行多版本 JAR 文件,它與運行一個簡單的 JAR 文件一樣好。
在我看來,Java 開始發生變化。 這是一個不斷增長的趨勢。 這是否意味著Java的流行和它的使用會受到影響? 一點也不。 在當今的科技行業,Java 一直是並且仍然是一種非常強大和健壯的編程語言。 開始學習 Java 並觀察它對您的職業生涯產生的影響。 祝你好運!
作者註:
該技術文章由 Sumit 提供,該文章致力於 DevOps、大數據和 Python 等趨勢技術。 在 Edureka 的數字營銷團隊中。