你会写 java 脚本吗?-JShell
什么是 JShell
从 Java9 开始,java 中推出了 JShell,他是一个交互式的脚本工具。在官方的说明上将其定义为 REPL(Read-Eval-Print Loop,读取-求值-输出 循环)工具,他的出现使得 Java 可以通过一种解释性的方式进行交互。
官网介绍地址为:https://docs.oracle.com/javase/9/jshell/introduction-jshell.htm
而由于这种读取、求值、输出的特性,使得我们不必像日常进行 Java 工程项目开发似的进行项目的编译等逻辑,举个例子一般我们的流程是:
写了一段包含 bug 的代码
修复编译时的问题
运行
确认运行时 bug
编辑修复
循环
这个循环的问题在于,有时候我们需要确认一小段逻辑,也需要经过完成的一个循环。比如我们要确认一小段逻辑是否正确,我们有时候会在被调试的代码的地方 psvm(如果你用 idea 的话)创建一个 main 方法,然后将要调试的逻辑在这里运行一下。但既然是用于测试代码,很有可能你其他的逻辑正写了一半,编译又无法通过,这时候就又要修复代码后再测试。说不上很难,但是很烦。
而使用 JShell 的话对于这种简单的测试就可以直接通过交互式的输入来进行测试,而省去编译、启动虚拟机、运行的时间。我们可以从 IDE 中复制需要调整的关键语句进入 JShell 执行,或者直接再 JShell 调试 API 再将确认好的代码贴到 IDE 中。
所以当我们要执行的代码非常的少的时候,
JShell 的使用
JShell 再 Java9 以及之后的版本中可以使用。
启动和退出
直接在终端中输入 jshell 就可以启动,在输入/exit 后将退出环境。

运行代码段
尝试声明一个变量 x,并设置它的值为 100:int x = 100;

如果你使用 jshell -v 的方式启动的话,则会显示更加详细的指令反馈:

如果没有分号也会帮你进行补充,而描述会具体的支出变量、引用的执行情况。
定义方法
我们可以通过多回行的方式来直接声明一个方法(这时候是不是应该叫函数来),而不用在一个在一个类中创建:

补全功能
JShell 也会根据前面输入的路径根据 tab 键提示补全内容,但是我们大概率不会直接在 JShell 中进行代码的编写,但是这个可以用来提示操作。

列出记录
我们可以用/list 列出已经存在于上下文的操作;用/methods 列出已经存在的方法。

包引用
在启动 JShell 的时候可以通过--add-exports 来引入外部包,然后通过 import 来引入。
文件编辑
可以通过/save 方法将当前的记录保存,也可以通过/open 将文件中的环境导入。


帮助
使用/help 打开帮助,jshell 的帮助很全,还有一些其他功能可以直接根据帮助进行看看。
用 JShell 运行脚本
尽管 JShell 的原始目的只是用于短小功能的在 JShell 内调试。但是也可以通过 JShell 来直接执行 Java 脚本代码。
初始化启动
在启动 JShell 的时候可以加入已经保存的脚本,脚本将在启动的时候执行。其中方法定义或者变量名会被初始化到环境上下文中,而有副作用的内容将直接执行。

在加载完初始化文件后将直接进入 JShell 环境中。
执行后退出
在脚本文件末尾加入退出命令 exit 脚本执行完毕后就会直接退出:

但是这样需要每一个文件后面都加入一个退出操作
多文件执行
JShell 可以依次执行多个文件,我们可以将退出的命令单独的封装到一个文件里面并最后执行:

这样我们可以通过不同脚本模块的组合来进行编排,并在执行完毕后退出。
最后
在简单实用了之后,感觉 JShell 的功能还是比较简陋,作为平时的运维工具的话还是不如 python 方便顺手。但是 JShell 的优势就在于可以通过包引入的方式,将实际工程代码中的内容直接通过脚本的方式调用,为组织平时的生产开发、测试、运维提供了一种新的问题解决思路。
版权声明: 本文为 InfoQ 作者【蜜糖的代码注释】的原创文章。
原文链接:【http://xie.infoq.cn/article/338a8c0701bc3cbb1bd2f6c77】。文章转载请联系作者。
评论