Bootstrap

你会写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的优势就在于可以通过包引入的方式,将实际工程代码中的内容直接通过脚本的方式调用,为组织平时的生产开发、测试、运维提供了一种新的问题解决思路。