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