Java 9正在大量新的增强功能,这将大大影响您的编程风格和习惯。最大的变化是Java的模块化。这是Java中的Lambdas之后的另一个重大变化8.在本文中,我将列出将成为JDK 9版本的一部分的更改。
什么是新中的Java 9Java 平台模块系统接口 私有方法HTTP 2客户端JShell - REPL工具平台 和 JVM记录过程API更新集合API更新流API改进多版本JAR文件@ 已弃用标签更改堆栈步行Java文档更新其他其他功能
Java平台模块系统
JPMS(Java Platform Module System)是新的Java 9版本的核心亮点。它也被称为 项目Jigshaw 。一个模块是像我们已经有包的新构造。使用新的模块化编程开发的应用程序可以被看作是具有明确界限和这些模块之间的依赖关系的交互模块的集合。
JPMS包括为编写模块化应用程序提供支持以及模块化JDK源代码。JDK 9随附约92个模块(GA版本可能更改)。Java 9 Module System有一个 “java.base” 模块。它被称为基本模块。它是一个独立模块,不依赖任何其他模块。默认情况下,所有其他模块都依赖于“java.base”。
在java模块化编程 -
一个模块通常只是一个jar文件,module-info.class 根目录下有一个 文件。
要使用模块,包括jar文件到 modulepath 代替 classpath 。添加到classpath的模块化jar文件是正常的jar文件, module-info.class 文件将被忽略。
典型的 module-info.java 类似如下:
module helloworld { exports com.howtodoinjava.demo;
接口私有方法
Java 8允许您在界面中编写默认方法,并被广泛认可的功能。所以在这之后,接口只有很少的东西,只有非私有的方法才是其中之一。Java 9之后,您可以在接口中包含私有方法。
这些私有方法将提高接口内的代码可重用性。如果有两个默认方法共享代码,私有接口方法将允许他们这样做,但是没有将该私有方法暴露给它的实现类。
在接口中使用私有方法有四个规则:
私有接口方法不能抽象。
私有方法只能在界面内部使用。
私有静态方法可以在其他静态和非静态接口方式中使用。
私有静态方法无法在私有静态方法中使用。
在接口中使用私有方法的一个例子 -
公共 界面 CustomCalculator { default int addEvenNumbers(int ... nums) { return add(n - > n% 2==0,nums);
Java 9 - 接口中的私有方法
HTTP / 2客户端
HTTP / 1.1客户端是在1997年发布的。因此,对于Java 9,引入了一种更加清晰,更清晰的API,并增加了对HTTP / 2的支持。新的API使用3个主要类别,即 HttpClient , HttpRequest和 HttpResponse 。
要提出请求,就像获取客户端一样简单,构建请求并发送它,如下所示。
HttpClient httpClient=HttpClient.newHttpClient();
以上代码看起来更加清晰可读。
新API还支持Async HTTP请求使用 httpClient.sendAsync() 方法。它返回CompletableFuture 可以用来确定请求是否已经完成的对象。它还提供您访问 HttpResponse 一次请求完成。最重要的是,如果您愿意,您甚至可以在完成之前取消请求。例如
if(httpResponse.isDone()){
JShell - REPL工具
JShell与JDK 9 发行版一起提供新的命令行交互式工具 [ JEP 222 ]来评估用Java编写的声明,语句和表达式。JShell允许我们执行Java代码片断并获得即时的结果,而无需创建解决方案或项目。
Jshell非常像我们在linux操作系统中有命令窗口。不同的是JShell是Java特定的。除了执行简单的代码片段,它还有很多其他功能。例如
在单独的窗口中启动内置代码编辑器
在单独的窗口中启动您选择的代码编辑器
在这些外部编辑器中执行保存操作时执行代码
从文件系统加载预写的类
Java 9 JShell教程
平台和JVM记录
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 类,它返回一个记录器实例。
JDK 9还添加了一个新的命令行选项, -Xlog 它可以让您单独访问从所有类JVM记录的所有消息。以下是使用该-Xlog 选项的语法 :
-Xlog [:
所有选项都是可选的。如果-Xlog 缺少上一部分, 则必须对该部分使用冒号。例如, -Xlog::stderr 表示所有部分是默认的,输出设置为 stderr 。
我将在深入的一篇文章中介绍这个话题。
进程API更新
在Java 5之前,产生新流程的唯一方法是使用该 Runtime.getRuntime().exec() 方法。然后在Java 5中, ProcessBuilder 引入了API,它支持产生新进程的更清洁的方法。现在Java 9正在添加一种获取有关当前和任何生成的进程的信息的新方法。
要获取任何进程的信息,现在您应该使用
java.langcessHandle 界面。这个界面可以用于获取大量信息,例如
该命令用于启动进程
命令的论据
进程启动的时刻
花费的总时间和创建它的用户
ProcessHandle processHandle=ProcessHandle .current();ProcessHandle。Info processInfo=processHandle();系统。println(processHandle.getPid());系统。println(processInfo.arguments()。isPresent());系统。println(pprocessInfomand()。isPresent());系统。println(processInfomand()。get()。contains(“java”));系统。println(processInfo.startInstant()。isPresent());
要获取新的生成过程的信息,请使用 process.toHandle() 方法获取 ProcessHandle 实例。休息所有的东西如上。
String javaPrompt=ProcessUtils.getJavaCmd()。getAbsolutePath();ProcessBuilder processBuilder=new ProcessBuilder(javaPrompt,“-version”);process process=processBuilder.inheritIO()。start();ProcessHandle processHandle=process.toHandle();
还可以使用
ProcessHandle.allProcesses() 系统中可用的所有进程的ProcessHandle流。
要获取所有子进程的列表(直接和深层次),使用 children() 和 descendants() 方法。
Stream < ProcessHandle > children=ProcessHandle.current()。children();
集合API更新
自从Java 9以来,您可以使用新的工厂方法创建不可变的集合,如不可变的列表,不可变的集合和不可变的映射。例如
import java.util。清单 ;
Java 9集合API改进
Stream API改进
Java 9引入了两种与Streams ie takeWhile / dropWhile methods 进行交互的新 方法。另外,它增加了两个重载的方法ie ofNullable 和 iterate 方法。
新方法, takeWhile 并 dropWhile 允许您根据谓词获取流的部分。
在有序流上, takeWhile 从流的开始处返回与从给定谓词匹配的流中获取的元素的“最长前缀”。 dropWhile 返回未匹配的剩余项目 takeWhile 。
在未排序的流中, takeWhile 从流的开始处返回与给定谓词(但不是全部)匹配的流的元素的子集。 dropWhile 在删除与给定谓词匹配的元素的子集后,返回剩余流元素。
类似地,直到Java 8,你不能 null 在流中有价值。这将造成 NullPointerException 。由于Java 9, Stream.ofNullable() 方法允许您创建一个单元素流,如果不包含一个值 null ,否则为空流。从技术上讲,Stream.ofNullable() 与流API的上下文进行通话时, 非常类似于空条件检查。
Java 9 Stream API改进
多版本JAR文件
此增强功能涉及如何在jar文件中打包应用程序类。以前,您必须将所有类打包到一个jar文件中,并放在另一个应用程序的类路径中,希望使用它。
使用多版本功能,现在一个jar可以包含不同版本的类 - 与不同的JDK版本兼容。关于类的不同版本的信息,JDK版本中哪个类将被加载的类被存储在 MANIFEST.MF 文件中。在这种情况下,MANIFEST.MF 文件Multi-Release: true 在其主要部分包含条目 。
此外,META-INF包含一个版本子目录,其子目录的整数名称以9(从Java 9开始)存储特定于版本的类和资源文件。例如
JAR 内容 根
我们假设在JDK 10中, A.class 更新为利用一些Java 10功能,那么这个Jar文件可以这样更新:
JAR 内容 根
它看起来非常有希望的一步来解决在大型应用程序中经常看到的依赖关系,其中具有不同版本的jar不相容。此功能可以帮助您解决这些情况。
@已删除标签更改
从Java 9开始, @Deprecated 注释将具有两个属性ie forRemoval 和 since 。
forRemoval - 指示注释元素是否在将来的版本中被删除。
因为 - 它返回注释元素已被弃用的版本。
强烈建议使用@deprecated的javadoc标签在文档中解释弃用程序元素的原因。文档还应建议并链接到推荐的替代API(如果适用)。替代API通常具有不同的语义,因此也应该讨论这样的问题。
堆栈走
该堆栈是先入先出(LIFO)数据结构。在JVM级别,堆栈存储帧。每次调用一个方法时,都会创建一个新的框架并将其推送到堆栈的顶部。当方法调用完成时,框架被破坏(从堆栈中弹出)。堆栈中的每个帧都包含自己的局部变量数组,以及它自己的操作数栈,返回值和对当前方法类的运行时常量池的引用。
在给定的线程中,任何点只有一个帧是活动的。活动帧被称为当前帧,其方法称为当前方法。[阅读更多 ]
直到Java 8 StackTraceElement 代表堆栈帧。要获得完整的堆栈,你必须使用Thread.getStackTrace() 和 Throwable.getStackTrace() 。它返回一个StackTraceElement 可以迭代的数组, 以获取所需的信息。
在Java 9中,StackWalker 引入了一个新类 。该类为当前线程使用顺序的堆栈帧提供了简单而有效的堆栈行为。该 StackWalker 班是非常有效的,因为它懒洋洋地评估堆栈帧。
//打印当前线程的所有堆栈帧的详细信息StackWalker .getInstance().forEach(系统。出来 ::的println);
还有其他许多事情你可以做这个流,我们将覆盖在其他一些decdicated的帖子。
Java文档更新
Java 9增强了javadoc 生成HTML5标记的 工具。它目前生成HTML 4.01中的页面。
为了生成一个HTML5 Javadoc,该参数 -html5 需要进入命令行参数。要在命令行上生成文档,您可以运行:
javadoc [options] [packagenames] [sourcefiles] [@files]
使用HTML5可以提供更轻松的HTML5结构的好处。它还实现 WAI-ARIA 无障碍标准。这样做的目的是使身体或视觉障碍的人更容易使用屏幕阅读器等工具来访问javadocs页面。
JEP 225 能够搜索javadoc中的程序元素和标记的单词和短语。
以下将被索引和搜索:
声明模块的名称
包
类型和成员
方法参数类型的简单名称
这是客户端实现的,带有一个新的 search.js Javascript文件,以及生成javadoc时生成的索引。生成的HTML5 API页面上提供了一个搜索框。
请注意,默认情况下将添加搜索选项,但可以使用参数关闭: -noindex 。
杂项其他功能
Java 9中还有其他功能,我在这里列出以供快速参考。我们将在即将发帖中讨论所有这些功能。
反应流API
GC(垃圾收集器)改进
过滤入站序列化数据
弃用Applet API
指示字符串连接
增强方法手柄
紧凑型弦乐
Nashorn的解析器API
Java 9计划于2021/09/21发布。
1、具有1-5工作经验的,面对目前流行的技术不知从何下手,
需要突破技术瓶颈的可以加。2、在公司待久了,过得很安逸,
但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。
3、如果没有工作经验,但基础非常扎实,对java工作机制,
常用设计思想,常用java开发框架掌握熟练的,可以加。
4、觉得自己很牛B,一般需求都能搞定。
但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。
6.阿里Java高级大牛直播讲解知识点,分享知识,
多年工作经验的梳理和总结,带着大家全面、
科学地建立自己的技术体系和技术认知!