Java Top.

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程

1.概述

Java 9带有丰富的功能集。虽然没有新的语言概念,但新的API和诊断命令肯定会对开发人员有趣。

在这个写作中,我们将有快速,高水平的一些新功能;可提供全新功能列表这里

2.模块化系统 - 拼图项目

让我们从大一个带来模块化到Java平台开始。

模块化系统提供类似于OSGI框架系统的功能。模块具有依赖项的概念,可以导出公共API并保持实施详细信息隐藏/私有。

这里的主要动机之一是提供模块化JVM,可以在具有较少可用内存的设备上运行。JVM可以仅使用应用程序所需的模块和API。查看这个链接有关这些模块的描述。

此外,JVM内部(实现)APIcom.sun。*从应用程序代码中不再访问。

简单地,模块将在调用的文件中描述module-info.java.位于Java代码层次结构的顶部:

module com.金宝搏188体育baeldung.java9.modules.car {需要com.baeldung.java9.modules.enegines;导出com.baeldu金宝搏188体育ng.java9.modules.car.handling;}

我们的模块需要模块引擎运行并导出包处理

有关更多深入的示例检查OpenJDKProject jigsaw:模块系统快速启动指南

3.一个新的HTTP客户端

一长遍更换旧的httpurlconnection.

新的API位于java.net.http.包裹。

它应该支持两者http / 2协议WebSocket.握手,性能应该与之相当Apache httpclient.纳塔蒂码头

通过创建和发送简单的HTTP请求,让我们来看看这个新功能。

更新:HTTP客户端JEP.正在移动到孵化器模块,因此包装不再可用java.net.http.而是可用的jdk.incubator.http。

3.1。快速获取请求

API使用Builder模式,这使得您可以轻松使用:

httprequest = httproest.newbuilder().uri(新的URI(“https://postman -echo.com/get”)).get().build();httpresponse  response = httpclient.newhttpclient().send(请求,httpresponse.bodyhandler.asstring());

4.处理API.

该过程API已经改进了控制和管理操作系统进程。

4.1。处理信息

班上java.lang.processhandle.包含大多数新功能:

processhandle self = processhandle.current();long pid = self.getpid();processhandle.info procinfo = self.info();可选 args = procinfo.arguments();可选 cmd = procinfo.commandline();可选<即时> starttime = procinfo.startinstant();可选 cpuusage = procinfo.totalcpudows();

当前的方法返回表示当前运行JVM的进程的对象。这信息子类提供有关该过程的详细信息。金宝搏官网188be

4.2。摧毁流程

现在 - 让我们停止所有正在运行的子流程破坏()

childproc = processhandle.current()。儿童();childproc.foreach(prochandle  - > {asserttrue(“无法杀死进程”+ prochandle.getpid(),prochandle.destroy());});

5.小语言修改

5.1。尝试 - 资源

在Java 7中,尝试 - 资源语法需要为由语句管理的每个资源声明新的变量。

在Java 9中有一个额外的细化:如果资源由最终或有效的最终变量引用,则尝试 - 资源语句可以在没有被声明的新变量的情况下管理资源:

myautoclosableableal mac = new myautoclosable();尝试(mac){//使用mac做一些东西}尝试(new myautocloseable(){} .finalwrapper.finalloseable){//使用finalclosable} catch(例外前){}

5.2。钻石运营商扩展

现在我们可以将钻石运营商与匿名内部类一起使用:

Fooclass  FC =新Fooclass <>(1){//匿名内部类};Fooclass <?扩展整数> FC0 =新FOOCLASS <>(1){//匿名内部类};Fooclass <?> Fc1 =新福克斯<>(1){//匿名内部类别};

5.3。接口私有方法

即将到来的JVM版本中的接口可以拥有私人的方法,可用于拆分冗长的默认方法:

接口interfacewithprivatemethods {private static字符串staticprivate(){return“静态私有”;私有字符串instanceprivate(){返回“实例私有”;}默认void检查(){string结果= staticprivate();interfacewithprivatemethods pvt = new interfacewithprivatemethods(){//匿名类};结果= pvt.InstancePrivate();}}}

6. jshell命令行工具

JShell是read-equ-print循环 - 短暂的。

简单地,它是一个交互式工具,用于评估Java的声明,语句和表达式,以及API。测试小型代码片段非常方便,否则需要创建新课程主要的方法。

jshell.可执行的本身可以找到 / bin文件夹:

JDK-9 \ bin> jshell.exe |欢迎来到JShell  - 版本9 |对于介绍类型:/帮助介绍jshell>“这是我的长字符串。我希望它的一部分”.substring(8,19);$ 5 ==>“我的长弦”

互动壳附带历史和自动完成;它还提供了从文件,全部或某些书面陈述中保存和加载的功能,如下所示:

jshell> / save c:\ develop \ jshell_hello_world.txt jshell> /打开c:\ develop \ jshell_hello_world.txt hello jshell!

代码片段在文件加载时执行。

7. JCMD子命令

让我们探索一些新的子命令jcmd.命令行实用程序。我们将获得在JVM中加载的所有类的列表及其继承结构。

在下面的示例中,我们可以看到层次结构java.lang.socket.socket.加载于JVM运行Eclipse Neon:

JDK-9 \ Bin> JCMD 14056 VM.CLASS_HIERARCHY -I -S java.net.socket 14056:java.lang.Object / null | --java.net.socket / null |实现java.io.closable / null(声明的Intf)|实现java.lang.autoclosable / null(继承的Intf)|| -org.eclipse.Ecf.internal.Provider.FileTransfer.httpclient4.closemonitoringsocket ||实现java.lang.autoclosable / null(继承的Intf)||实现java.io.closable / null(继承的Intf)|| --javax.net.ssl.slsocket / null || implements java.lang.AutoCloseable/null (inherited intf) | | implements java.io.Closeable/null (inherited intf)

第一个参数jcmd.命令是我们想要运行该命令的JVM的进程ID(PID)。

另一个有趣的子命令是set_vmflag.。我们可以在线修改一些JVM参数,而无需重新启动JVM进程并修改其启动参数。

您可以找到具有子命令的所有可用VM标志JCMD 14056 VM.FLAGS -ALL

8.Мulti-分辨率图像API

界面java.awt.image.multireLatureDimage.将具有不同分辨率的一组图像封装到单个对象中。我们可以基于给定DPI度量标准和图像变换集或检索图像中的所有变体来检索分辨率特定的图像变型。

java.awt.Graphics.类基于当前显示DPI度量标准和任何应用的变换,类从多分辨率图像获得变体。

班上java.awt.image.basemultiresolatureImage.提供基本实现:

Bufferedimage []解决variants = .... MultiAseolatureImage BMrimage = New BaseMultIresolutionImage(BaseIndex,DecoparyVariants);图像testrvimage = bmrimage.getresolutionvariant(16,16);AssertSame(“图像应该是相同的”,testRvimage,ResolutionVariants [3]);

9.可变手柄

API居住在下面java.lang.invoke.并包括varhandle.methodHandles.。它提供了等同的java.util.concurrent.atomic.sun.misc.unsafe.unsafe对象字段和具有类似性能的数组元素的操作。

使用Java 9模块化系统访问sun.misc.unsafe.unsafe从应用程序代码中将无法进行。

10.发布 - 订阅框架

班上java.util.concurrent.flow.flow.flow.flow.flow.提供支持的接口反应溪流发布 - 订阅框架。这些接口支持在JVM上运行的许多异步系统上的互操作性。

我们可以使用实用课程提交的Publisher.创建自定义组件。

11.统一的JVM日志记录

此功能引入了用于JVM的所有组件的公共日志记录系统。它提供了对日志记录的基础结构,但它不会添加来自所有JVM组件的实际记录呼叫。它也不会在JDK中添加日志记录到Java代码。

日志记录框架定义了一组标签- 例如,GC编译器线程等等我们可以使用命令行参数-xlog.在启动期间打开日志记录。

让我们使用“debug”级别标记为标记的消息,使用“调试”级别到名为“gc.txt”的文件,没有装饰:

java -xlog:gc = debug:file = gc.txt:none ...

-xlog:帮助将输出可能的选项和示例。可以使用日志记录配置进行修改运行时jcmd.命令。我们将设置GC日志来信息并将其重定向到文件 - GC_LOGS:

JCMD 9615 VM.log输出= GC_LOGS是什么= GC

12.新的API.

12.1。不可改变的集合

java.util.set.of()- 创建一个不可变的给定元素集。在Java 8中,创建一组多个元素将需要多行代码。现在我们可以尽可能简单:

set  strkeyset = set.of(“key1”,“key2”,“key3”);

此方法返回的是JVM内部类:java.util.immutablecollections.setn.,延伸公众java.util.abstractset.。它是不可变的 - 如果我们尝试添加或删除元素,UnsupportedoperationException.将被抛出。

您还可以将整个数组转换为a用相同的方法。

12.2。可选流

java.util.optional.stream()为我们提供了一种简单的方法,请在可选的元素上使用流的流量:

list  filteredlist = listofoptionals.stream().flatmap(可选:: stream).collect(collectors.tolist());

13.结论

Java 9将带有模块化JVM和许多其他新的和多种改进和功能。

您可以找到示例的源代码在github上

Java底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程
9.注释
最老的
最新
内联反馈
查看所有评论
评论在本文上关闭!