您的位置:首页 > 运维架构 > Shell

体验 Java 9 交互式编程环境Jshell使用示例

2018-02-08 10:08 441 查看

简介

Java 9 正式版已于当地时间的 9 月 21 日(北京时间大约是9月22日凌晨)如期发布。可前往Oracle 官网下载
Java 9 没有像 Java 5/Java 8 那样引入新的编程范式而给语言本身带来革命性的改进,不过 Java 9 的改动还是很大的,尤其是引入模块化对 JDK 与运行时的改动都很大。

特性

▶ 交互式命令行(JEP 222: jshell: The Java Shell)

简称 JShell,方便对程序进行调试,以及快速检验 API 的可行性,你无须创建一个项目来学习 API,打开 JShell 即可。

▶ 进程操作改进(JEP 102: Process API Updates)

新增的 
java.lang.ProcessHandle
 类丰富了对进程的操作,同时原有的 
java.lang.Process
 类的功能也被加强了。

▶ 竞争锁的性能优化(JEP 143: Improve Contended Locking)

能够改善程序运行时的多线程同步效率。

▶ 代码执行效率改善(JEP 197: Segmented Code Cache)

这个特性一般不会在 Java 代码中直接使用,它通过对本地编译代码(即代码缓存)进行更好的组织,让 JRE 的运行效率有所提高。

▶ Java 模块化(JEP 261: Module System)

这就是令 Java 9 跳票数次的罪魁祸首 Project Jigsaw。这里就不多说了。
 

▶ ResourceBundle 支持 UTF-8 编码(JEP 226: UTF-8 Property Resource Bundles)

ResourceBundle 的缺省编码问题一直是被吐槽的对象,非英文字符被转码为看不懂的形式,严重损害了代码的可读性。从 Java 9 开始,ResourceBundle 默认编码为 UTF-8。

▶ G1 成为默认的垃圾收集器(JEP 248: Make G1 the Default Garbage Collector)

G1 进一步减少了 GC 时的停顿时间(GC pause time),其实它从 JDK 8u40 开始就已经十分完善,足以作为默认的垃圾收集器了。

▶ 优化字符串占用空间(JEP 254: Compact Strings)

在很多应用当中,字符串已经成为一个消耗内存的主要部分。通过优化字符串的占用空间,应用的内存使用可以得到明显改善。
如果你还在用 Java 6/7,那么上面这些性能方面的优化(还不算 Java 8 的优化)就足以让你尽快升级到 Java 9 了。
Java 9 还有其他一些方面的新特性,比如 jlink,支持 tiff 图片,支持 Unicode 8,支持 SHA-3,对 ECMAScript 6 的部分支持,优化对调用堆栈(Call Stack)的访问,HTML5 格式的 JavaDoc、通过利用最新架构的 CPU 指令来加速加密解密操作,等等。
主要特性官方页面:http://openjdk.java.net/projects/jdk9/

使用

Jshell交互式命令行

这个命令行环境为Java平台带来了读入-求值-打印-循环(Read-Eval-Print-Loop,REPL)功能。非常适合快速实验一些代码片段。JShell,就像其他 REPL 一样,有利于探索式编程,我们很容易地进行交互式尝试和调试不同的算法和结构。
它遵循通用的命令行操作,如 
Tab
 自动补全、
Ctrl-D
 退出、
Ctrl-R
 反向搜索、
Ctrl-S
 正向搜索等等。 运行 
jshell --help
 可以查看其命令行选项说明,直接运行 
jshell
 进入交互式模式后,可以通过 
/help
 查看交互式模式帮助。 更详细的用法说明可参见其官方文档
运行 
jshell.exe
 进入交互式模式:
$ jshell
|  欢迎使用 JShell -- 版本 9
|  要大致了解该版本, 请键入: /help intro

jshell>
jshell> 
是 JShell 的命令提示符,可在其后直接键入代码。在 JShell 中直接输入可运行的代码就可以,无需定义额外的类与 
main
 函数,还可以省略单行语句的分号
(tips:语句末尾的“;” 是可选的。但推荐还是最好加上。提高代码可读性)。因此运行 Hello World 只需键入 
System.out.println("Hello, World!")
 即可,并且在输入过程中还可以通过 Tab 键补全:
jshell> System.out.println("Hello, World!")
Hello, World!
大功告成。当然,如果只是想在 JShell 中查看一个表达式的求值结果,并不需要调用 
System.out.println()
 这么麻烦,而只需直接键入表达式然后回车即可:
jshell> "Hello, World!"
$2 ==> "Hello, World!"

jshell> Math.PI * 1.5 * 1.5
$3 ==> 7.0685834705770345
这实际上是 JShell 的“反馈”,如果希望反馈中包含表达式的类型,可以在启动时加命令行选项 
-v
 或者通过交互模式的命令 
/set feedback verbose
 切换到详细反馈模式:
jshell> /set feedback verbose
|  反馈模式: verbose

jshell> "Hello, World!"
$4 ==> "Hello, World!"
|  已创建暂存变量 $4 : String

jshell> double areaOfCircle(double radius) {
...>     return Math.PI * radius * radius;
...> }
|  已创建 方法 areaOfCircle(double)

jshell> areaOfCircle(1.5)
$6 ==> 7.0685834705770345
|  已创建暂存变量 $6 : double
默认情况下,JShell提供了一些常用包的导入,我们可以使用 import 语句导入必要的包或是从指定的路径的包,来运行我们的代码片段。我们可以输入以下命令列出所有导入的包:
/imports
更多交互式模式的用法可以查阅文档或自行发掘,或查看推荐博客:http://blog.csdn.net/hj7jay/article/details/70153927
现在通过快捷键 
Ctrl-D
 或者交互式命令 
/exit
 退出 JShell,来看下非交互式 JShell 版 Hello World。
 
还只看到这,待续。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: