深入解析Java 9关键特性与实战代码示例

更新:11-12 名人轶事 我要投稿 纠错 投诉

本文主要内容:

Java 模块化接口私有方法HTTP/2 客户端JShell - REPL 工具平台和JVM 日志记录流程API 更新集合(Collection) API 更新流(Stream) API 改进多版本Jar 文件@Deprecated 注解更改Java 文档更新其他功能

1. Java 模块化

JPMS (Java平台模块系统)是Java 9版本的核心亮点。它也被称为Jigshaw 项目。模块是新的构造,就像我们已有的包一样。使用新的模块化编程开发的应用程序可以被视为交互模块的集合,这些模块之间具有明确定义的边界和依赖关系。

JPMS 支持编写模块化应用程序和模块化JDK 源代码。 JDK 9 附带了大约92 个模块(可以在GA 版本中更改)。 Java 9 模块系统有一个"java.base"模块。它称为基本模块。它是一个独立的模块,不依赖于任何其他模块。默认情况下,所有其他模块都依赖于“java.base”。

在java模块化编程中:

模块通常只是一个jar 文件,根目录中有一个文件module-info.class。要使用模块,请将jar 文件包含到模块路径而不是类路径中。添加到类路径中的模块化jar 文件是普通jar 文件,并且module-info.class 文件将被忽略。典型的module-info.java 类如下所示:

模块你好世界{

导出cn.dayangshuo.demo;

}

模块测试{

需要你好世界;

}

2. 接口私有方法

Java 8 允许在接口中编写默认方法,这是一个受欢迎的功能。从Java 9 开始,您可以在接口中包含私有方法。

这些私有方法将提高接口内代码的可重用性。例如,如果两个默认方法需要共享代码,则私有接口方法将允许它们这样做,但不会将私有方法公开给其实现类。

在接口中使用私有方法有四个规则:

私有接口方法不能是抽象的。私有方法只能在接口内部使用。私有静态方法可以在其他静态和非静态接口方法中使用。私有非静态方法不能在私有静态方法内部使用。例子:

公共接口自定义计算器{

默认int addEvenNumbers(int. nums) {

return add(n -n % 2==0, nums);

}

默认int addOddNumbers(int. nums) {

return add(n -n % 2 !=0, nums);

}

私有int add(IntPredicate 谓词, int. nums) {

返回IntStream.of(nums)

.filter(谓词)

。和();

}

}

3. HTTP/2客户端

HTTP/1.1 客户端于1997 年发布。此后发生了很多变化。因此,Java 9引入了新的API,使用起来更加干净、清晰,同时还增加了对HTTP/2的支持。新的API 使用3 个主要类HttpClient、HttpRequest 和HttpResponse。

要发出请求,只需获取客户端、构建请求并发送即可,例如:

HttpClient httpClient=HttpClient.newHttpClient();

HttpRequest httpRequest=HttpRequest.newBuilder().uri(new URI("https://baidu.com/")).GET().build();

HttpResponsehttpResponse=httpClient.send(httpRequest, HttpResponse.BodyHandler.asString());

System.out.println(httpResponse.body());上面的代码看起来更清晰,更容易阅读。

该API 还支持使用httpClient.sendAsync() 方法的异步HTTP 请求。它返回一个CompletableFuture,可用于确定请求是否已完成。也可以在HttpResponse 请求完成后访问它。如果您愿意,您甚至可以在请求完成之前取消该请求。

例子:

如果(httpResponse.isDone()){

System.out.println(httpResponse.get().statusCode());

System.out.println(httpResponse.get().body());

} 别的{

httpResponse.cancel(true);

}

4. JShell REPL 工具

JShell 是JDK 9 版本[JEP 222] 中包含的一个新的命令行交互工具,用于评估用Java 编写的声明、语句和表达式。 JShell 允许我们执行Java 代码片段并立即获得结果,而无需创建解决方案项目。

Jshell很像我们linux操作系统中的命令窗口。不同之处在于JShell 是特定于Java 的。除了执行简单的代码片段之外,它还有许多其他功能,例如:

在单独的窗口中启动内置代码编辑器在单独的窗口中启动您选择的代码编辑器在这些外部编辑器中发生保存操作时执行代码从文件系统加载预先编写的类

5. 平台和 JVM 日志记录

通过new JDK 9日志记录API 改进了平台类(JDK 类)和JVM 组件中的日志记录。它允许开发人员指定他们选择的日志框架(例如Log4J2)作为记录来自JDK 类的消息的日志工具。

关于此API,您应该了解以下几点:

该API 旨在供JDK 中的类使用,而不是供应用程序类使用。对于应用程序代码,开发人员将像以前一样继续使用其他日志记录API。 API 不允许开发人员以编程方式配置记录器。 API由以下部分组成:

服务接口,java.lang.System.LoggerFinder是一个抽象静态类java.lang.System.Logger接口,提供日志记录API。 getLogger() 类中的重载方法java.lang.System,它返回一个logger 实例。 JDK 9 还添加了一个新的命令行选项-Xlog,它使开发人员可以通过单点访问从JVM 中的所有类记录的所有消息。以下是使用-Xlog 选项的语法:

-Xlog[:][:[][:[][:]]] 所有选项都是可选的。如果缺少前面的-Xlog 部分,则该部分必须使用冒号。例如,-Xlog:stderr 表示所有部分都是默认的,并且输出设置为stderr。

6. Process API更新

在Java 5 之前,生成新进程的唯一方法是使用Runtime.getRuntime().exec() 方法。然后在Java 5 中,引入了ProcessBuilder API,它支持以更简洁的方式生成新进程。现在,Java 9 添加了一种新方法来获取有关当前进程和任何衍生进程的信息。

要获取任何进程的信息,现在您应该使用java.lang.ProcessHandle.Info 接口。通过该接口可以获取大量的信息,例如:

启动进程命令的参数进程启动的时刻进程和创建进程的用户所花费的总时间ProcessHandle processHandle=ProcessHandle.current();

ProcessHandle.Info processInfo=processHandle.info();

System.out.println(processHandle.getPid());

System.out.println(processInfo.arguments().isPresent());

System.out.println(pprocessInfo.command().isPresent());

System.out.println(processInfo.command().get().contains("java"));

System.out.println(processInfo.startInstant().isPresent());要获取有关新生成的进程的信息,请使用process.toHandle() 方法获取ProcessHandle 实例。其他一切都如上所述。

String javaPrompt=ProcessUtils.getJavaCmd().getAbsolutePath();

ProcessBuilder processBuilder=new ProcessBuilder(javaPrompt, "-version");

进程process=processBuilder.inheritIO().start();

ProcessHandle processHandle=process.toHandle();也用于ProcessHandle.allProcesses()来获取系统中所有可用进程的ProcessHandle流。

要获取所有子进程的列表(直接获取n 层深度),请使用children() 和descendants() 方法。

Streamchildren=ProcessHandle.current().children();

Streamdescendants=ProcessHandle.current().descendants();

6. Collection(集合) API更新

从Java 9 开始,您可以使用新的工厂方法来创建不可变集合,例如不可变列表、不可变集和不可变映射。例如:

导入java.util.List;

公共类ImmutableCollections {

公共静态无效主(字符串[] args){

ListnamesList=List.of("洛克什", "阿米特", "约翰");

SetnamesSet=Set.of("洛克什", "阿米特", "约翰");

地图名称地图=Map.ofEntries(

Map.entry("1", "洛克什"),

Map.entry("2", "阿米特"),

Map.entry("3", "布莱恩"));

}

}

7. Stream(流) API改进

Java 9 引入了两种与Stream 交互的新方法,即takeWhile/dropWhile 方法。此外,它还添加了两个重载方法,即ofNullable 和iterate 方法。

新方法takeWhile。 dropWhile 允许开发人员根据谓词获取流的一部分

在有序流上,takeWhile 返回从流中获取的与给定谓词匹配的元素的“最长前缀”,从流的开头开始。 dropWhile 返回与takeWhile 不匹配的剩余项目。

在无序流上, takeWhile 从流的开头开始返回与给定谓词(但不是全部)匹配的流元素的子集。 dropWhile 在删除与给定谓词匹配的元素子集后返回剩余的流元素。

Listalphabets=List.of("a", "b", "c", "d", "e", "f", "g", "h", "i");

列表子集1=字母表

。溪流()

.takeWhile(s -!s.equals("d"))

.collect(Collectors.toList());

//打印出:[a,b,c]

System.out.println(subset1);

Listalphabets=List.of("a", "b", "c", "d", "e", "f", "g", "h", "i");

Listsubset2=字母表

。溪流()

.dropWhile(s -!s.equals("d"))

.collect(Collectors.toList());

//打印出:[d, e, f, g, h, i]

System.out.println(subset2);同样,Java 8之前,流中不能有空值。它会导致NullPointerException。从Java 9 开始,Stream.ofNullable() 方法允许您创建一个单元素流,该流包装不为null 的值,否则为空流。从技术上讲,Stream.ofNullable() 与流API 上下文中的null 条件检查非常相似。

8. 多版本Jar文件

此增强功能与应用程序类打包到jar 文件的方式有关。以前,开发人员必须将所有类打包到一个jar 文件中,然后将其放入另一个想要使用它的应用程序的类路径中。

使用多版本功能,现在一个jar 可以包含与不同JDK 版本兼容的类—— 的不同版本。有关类的不同版本以及应为加载的类选择哪个JDK 版本的信息存储在MANIFEST.MF 文件中。在本例中,文件MANIFEST.MF 在其主要部分中包含条目Multi-Release: true

此外,META-INF 包含一个版本子目录,其以整数命名的子目录—— 从9(对于Java 9)—— 开始,存储特定于版本的类和资源文件。例如

JAR 内容根

A级

B级

C级

D级

元信息文件

清单.MF

版本

9

A级

假设在JDK 10 A.class 中更新了B.class 以利用一些新的Java 10 功能,则可以像这样更新此Jar 文件:

JAR 内容根

A级

B级

C级

D级

元信息文件

清单.MF

版本

9

A级

B级

10

A.class 看起来非常有希望解决大型应用程序中常见的依赖地狱,其中不同版本的jar 彼此不兼容。这个功能对于解决这些情况有很大帮助。

9. @Deprecated 注解更改

从Java 9 开始,@Deprecated 注释将具有两个属性:forRemoval 和since。

forRemoval 指示是否将在未来版本中删除带注释的元素。

因为-它返回注释元素的已弃用版本。

强烈建议使用@deprecated javadoc 标签来解释文档中不推荐使用程序元素的原因。如果适用,文档还应建议并链接到推荐的替代API。替换API 通常具有细微不同的语义,因此也应该讨论此类问题。

10. Java 文档更新

Java 9 增强了用于生成HTML5 标记的javadoc 工具。它当前生成HTML 4.01 的页面。

为了生成HTML5 Javadoc,需要在命令行参数中放置参数-html5。要在命令行上生成文档,您可以运行:

javadoc [选项] [包名称] [源文件] [@文件] 使用HTML5 带来了更简单的HTML5 结构的好处。它还实施了WAI-ARIA 标准以实现可访问性。这样做的目的是让有身体或视觉障碍的人能够使用屏幕阅读器等工具更轻松地访问javadoc 页面。

JEP 225 提供了在javadoc 中搜索程序元素以及标记的单词和短语的功能。

以下内容将被索引和搜索:

模块的声明名称包类型和成员方法参数类型的简单名称这是在客户端实现的,新建了一个search.jsJavascript文件,以及生成javadoc时生成的索引。生成的HTML5 API 页面上有一个搜索框。

请注意,默认情况下会添加搜索选项,但可以使用参数:-noindex 将其关闭。

好了,关于深入解析Java 9关键特性与实战代码示例和的问题到这里结束啦,希望可以解决您的问题哈!

用户评论

安之若素

哇,终于看到Java 9的最新功能了!很期待看看这个版本带来的更新,尤其是那些代码改进。

    有8位网友表示赞同!

太难

这篇文章正好赶上了我的学习计划,最近想深入了解 Java 9 的特性, 看起来非常有帮助!

    有11位网友表示赞同!

来自火星的我

代码示例永远是学习新技术的最佳良伴。希望这篇文章能解释得清晰易懂!

    有20位网友表示赞同!

?亡梦爱人

Java 每次的更新都让我兴奋不已。这次哪些新特性最让你期待呢?

    有18位网友表示赞同!

歇火

我一直用的 Java, 想知道有什么新功能可以提升我的开发效率。

    有16位网友表示赞同!

红尘烟雨

最近在研究多模块项目,不知道 Java 9 有没有对这方面的改进?

    有13位网友表示赞同!

该用户已上天

这个标题让我感觉作者一定是 Java 开发高手啊!

    有17位网友表示赞同!

熏染

希望能详细讲解哪个特性最显著的影响?

    有13位网友表示赞同!

空巷

学习新东西永远不容易!期待这篇文章能给我一些启发。

    有19位网友表示赞同!

。婞褔vīp

我还在学习 Java ,想看看 Java 9 是如何让编程变得更加简单易用?

    有5位网友表示赞同!

凉话刺骨

Java 的代码语法一直都很强大,希望新特性能够增强它的功能。

    有15位网友表示赞同!

情如薄纱

代码示例总是让我更快理解新的概念!

    有18位网友表示赞同!

寻鱼水之欢

我一直在关注最新的 Java 版本更新,这次不会错过这篇文章了!

    有20位网友表示赞同!

蝶恋花╮

作为一名 Java 开发者,必须了解最新的技术趋势。

    有8位网友表示赞同!

白恍

感觉Java9会给我带来不少惊喜!

    有17位网友表示赞同!

醉枫染墨

学习新特性是不断进步的必修课!

    有6位网友表示赞同!

此生一诺

我已经迫不及待了!期待这个文章能解释清楚 Java 9 的新特性!

    有18位网友表示赞同!

何年何念

希望这篇文章能帮助我更好地理解 Java 9 的设计理念。

    有12位网友表示赞同!

凉月流沐@

分享这种技术学习资源真的很棒!

    有10位网友表示赞同!

一笑傾城゛

学习新的代码功能总是充满挑战和乐趣!

    有14位网友表示赞同!

【深入解析Java 9关键特性与实战代码示例】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:时尚潮流服饰精选 下一篇:浪琴机械表仿制品价格及售价一览