用 JShell 快速实现代码原型_java

海滩上的贝壳,图片来自Flickr


许多年前,解释型编程语言就能在命令行中快速执行代码了。无需启动IDE,也不需要编译,敲入代码就能立即查看结果。事实证明,这种方式对新手很有帮助。因为这样尝试新的编程语言,不会被编译器、依赖项和构建系统困扰。JShell是JDK 9中一个经常被忽略的特性:它是一个Read-Evaluate-Print Loop (REPL) 环境,在JSHell中可以不用编译就能调用Java代码。


REPL是什么


简而言之,就是输入几个命令(Read),它就会被解释(Evalueate),命令的结果会转发出来(Print)。这个流程会一直持续到退出(Loop)。这就是R(ead) E(valuate) P(rint) L(oop)。


启动JShell


如果命令行支持Java JDK 9或更高版本,只要输入jshell就可以启动JShell:


用 JShell 快速实现代码原型_java_02

调用JShell


jshell> 提示符出现后,表示JShell当前处于R(ead)模式,等待输入。

要快速浏览可用命令,可以输入 /help:


JShell help


命令、代码自动完成和引用


JShell使用TAB键进行代码提示与自动完成。输入System.out,按TAB,完成System.out.println(“Hello World”):


代码提示与自动完成


实际上,REPL会打印所有输入的命令,因此不需要System.out打印命令(也不用以分号;结束):


解释命令


JShell支持变量,使用特殊的$引用之前的结果:


变量与结果引用


JShell一个有趣功能是支持前向引用。前向引用指,引用JShell中没有定义的方法、变量或类。例如,有一个valueOfStocks方法,根据当前价格和拥有的股票数量计算持有的股票总值。可以先定义计算方法,然后再提供每种股票的实际数量与当前价格:


前向引用


package、import与外部开发库


JShell默认会import一些Java常用的package:


默认导入的package


只要使用import就可以导入需要的package:


用 JShell 快速实现代码原型_java_03

导入package


使用外部开发库的代码时(例如JAR中的代码),需要把所需的JAR加到JShell的classpath中,然后只导入需要的包:


用 JShell 快速实现代码原型_java_04

使用外部开发库


保存、加载和运行


JShell支持从本地保存和导入资源(即JShell脚本),分别使用/save和/open命令。还可以在JShell启动时加载之前保存的会话:


用 JShell 快速实现代码原型_java_05

保存和加载JShell会话


有了JShell,无需编译代码就能轻松地对代码段进行测试或者设计算法原型。在REPL环境中,输入的命令可以直接得到反馈。了解更多JShell信息,可以参考Oracle的JShell教程。