写点什么

你会写 java 脚本吗?-JShell

  • 2022 年 2 月 11 日
  • 本文字数:1382 字

    阅读完需:约 5 分钟

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

发布于: 刚刚阅读数: 2
用户头像

人肉bug制造机 2020.06.26 加入

欢迎关注同名公众号!

评论

发布
暂无评论
你会写java脚本吗?-JShell