Java 9 – 你需要知道的关于新 Java 特性的一切

已发表: 2018-04-24

Java 是一种高度可访问的编程语言,它对全球的开发人员来说是一件轻而易举的事。 自 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 的缺点:

  1. JDK 不适用于小型计算设备
  2. 应用程序性能没有整体提升
  3. JDK没有整体的安全和维护
  4. Java 开发人员面临构建和维护代码库和更大应用程序的困难

那么,让我们看一下 Java 9 相对于其前身提供的主要变化和增强功能

在 Java 9 中处理 API 更新

传统上,Java 的 API 在本质上是原始的。 支持启动新进程、重定向输出和错误流。 在 Java 9 中,对 Process API 的新更新支持:

  1. 获取当前和任何其他 JVM 进程的 PID
  2. 管理子流程
  3. 管理子流程
  4. 获取系统中运行的进程的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 提供以下功能:

  1. 处理大多数 HTTP 请求的简单而简洁的 API
  2. 支持 HTTP/2 规范
  3. 更好的性能
  4. 更好的安全性
  5. 更多增强功能

这是使用新 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 中的拼图项目

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 的数字营销团队中。