JShell——Java 9 的交互式编程环境

本文要求读者有基本的 Java 知识。

Tips

Java 9 的代码由于提供了新特性,所以有些代码并不支持向后兼容。也就是说,用 Java 9 写的代码,有可能在 Java 8 或更早版本的 JDK 上不能运行。

1. 在操作系统上安装开发所需要的软件

首先,你需要下载JDK 9 (Java Development Kit 9) ,需要到此网站来下载JDK 9。首先需要先同意许可协议,然后就可以下载了。

Java 9 可以运行在很多平台上:

  • Windows 32-bit
  • Windows 64-bit
  • macOS 64-bit (以前称之为 Mac OS X 或 OS X)
  • Linux 32-bit
  • Linux 64-bit
  • Linux on ARM 32-bit
  • Linux on ARM 64-bit

下一步需要配置环境变量。跟之前的 JDK 配置方法相同。这里,我以 macOS 10.12 版本为例,在 Macbook 上的配置。这里会需要 vi 的一些基本操作,可以去网上查找如何使用。

  1. 下载完 JDK 后,直接运行。然后安装目录在:

    /library/Java/JavaVirtualMachines/jdk-9.jdk/
  2. 在 Terminal 下,进入到你的用户的当前目录下(一打开就是你的用户默认目录,实在不清楚在命令行敲入cd则会切换到默认目录下)。
  3. 在命令行中执行 ls -a命令,列出当前目录下的包括隐藏的文件或目录。

4.找到 .bash_profile文件,此文件会影响你当前用户的配置信息,并执行vi .bash_profile 命令编辑此文件。

5.进入编辑页面后,配置 Java Home 和 Path 环境变量:

6.配置完以后,使用esc键退出编辑状态,输入“:wq”,保存并退出。并执行

. .bash_profile,使配置文件立刻生效。

7. 在命令行下执行javac -version,如果输出如下信息,则说明 JDK 配置正确。

至此,JDK 配置完成。

启动JShell。

在Terminal下输jshell -v,

此时,就进入JShell 开发环境,命令行里是以jshell>开头。

如果想退出JShell 环境,则输入/exit命令。

2. 理解在交互式编程环境下开发的好处

Java 9 中引入了交互式编程环境(REPL),这就是JShell,它允许可以执行 Java脚本代码,并且立即返回结果。因此,我们不需要创建什么一个解决方案或工程,就能很容易地编写代码并能很快的看到运行结果。我们不必等待整个项目 build 完去检查多行代码的执行结果。JShell,就像其他 REPL 一样,有利于探索式编程,我们很容易地进行交互式尝试和调试不同的算法和结构。

3. 第一个 JShell 下的 Java 代码

我们简单写一个 JShell 下的一个 Java 代码,就是一个打印输入。

 System.out.println("Hello, Java 9, now I am in JShell!")

输出结果为:

Tips

在 JShell 环境下,语句末尾的“;” 是可选的。但推荐还是最好加上。提高代码可读性。

在一些例子中,我们将利用JShell 这一特性,提供对网络的访问。此功能与Web Service交互时非常有用。然而,你必须确保你的防火墙配置不会阻挡 JShell。

4. 查看默认导入和使用自动补全功能

默认情况下,JShell提供了一些常用包的导入,我们可以使用import 语句导入必要的包或是从指定的路径的包,来运行我们的代码片段。我们可以输入以下命令列出所有导入的包:

/imports

下面就会列出已经导入的包:

当我们在 JShell 之外写 Java 代码时,如所需要的 java.lang 包是默认导入的。在 JShell 下使用/imports命令并没没有列出这些包,以下是所有的在 JShell 环境下默认导入的包:

  • java.lang
  • java.io
  • java.math
  • java.net
  • java.nio.file
  • java.util
  • java.util.concurrent
  • java.util.function
  • java.util.prefs
  • java.util.regex
  • java.util.stream

此外,JShell 提供了自动补全的功能,只需按下 Tab 键,就能自动补全。

但有些情况下,根据我们输入的语句会对应很多选项,这时候 JShell 就会全部给你列出来。

例如,当我输入 S 时,就会列出来所以以 S 开头的类。

当我们想输入System类时,根据前面说的自动补全,只需要输入Sys然后按下 Tab 键,则自动补全, 然后再输入“.o”,则会自动补全方法, 在补全“System.out.”后按下 Tab 键,接下来就会列出当前类的所有的 public 方法的列表。



最后完整输入:

System.out.println("Auto-complete is helpful in JShell");

5. 在JShell中编写 Java 9 代码

首先,在命令行下可以执行jshell -v来进入命令行的开发环境

下面我们定义calculateRectangleArea方法来计算一个正方形的面积。

float calculateRectangleArea(float width, float height) {
return width * height;
}

然后输入回车,则会输入如下信息:

Tips

所有从 JShell 输出的消息用“|”表示。

输入/list 在 JShell 中,会列出到目前为止当前 session 里所有有效的代码片段。

接下来我们定义一个 float类型的变量width并赋值为50:

float width = 50;

输入完上面的代码后,JShell 就会给我们如下信息:

然后定义height变量:

float height = 25;

接着输入float area = ca 然后自动补全为float area = calculateRectangleArea(,再输入刚才定义的变量widthheight,则方法则计算出面积并返回1250.0。

下面我们再使用/list列出到目前为之所有有效的代码片段。

输入以下代码:

System.out.printf("Width: %.2f, Height: %.2f, Area: %.2f\n", width, height, area);

则会输入如下信息:

6. 计算表达式

Java 9 中运行我们评估任何有效的表达式,在 JShell中输入如下表达式:

width * height;

当我们输入上面的表达式,它就会给分配给一个临时的变量,这个变量以“$”开头,并跟着一个数字。这个变量是$6,但也有可能是$7, $8。

在当前 session 中,我们可以在接下来的代码中直接使用此临时变量,例如:

System.out.printf("The calculated area is %.2f\n", $6);

我们还可以使用之前的临时变量进行响应的运算,例如,

$6 + 10.5f;

7. 使用变量、方法和源代码

到目前为止,我们创建了很多变量,我们可以使用/vars来查看当前 session 下所有创建过的变量:

我们再定义一个方法:

float calculateRectanglePerimeter(float width, float height) {
return 2 * (width + height);
}

然后使用/methods 来查看所有的方法。

你也可以 修改已经存在的方法,例如,calculateRectanglePerimeter的方法改为如下:

float calculateRectanglePerimeter(float width, float height) {
float perimeter = 2 * (width + height);
System.out.printf("Width: %.2f\n", width);
System.out.printf("Height: %.2f\n", height);
System.out.printf("Perimeter: %.2f\n", perimeter);
return perimeter;
}

然后输出以下信息:

我们还可以使用 /list method name来查看具体某一个方法的具体信息:

8. 使用外部代码编辑器来编写 Java 代码

现在,我想对calculateRectangleArea方法做一些改动,如果这时有外部代码编辑器的话,做起来会很容易。

在 JShell 中可以启用JShell Edit Pad 编辑器,需要输入如下命令,来修改上面的方法:

/edit calculateRectangleArea

接下来就会显示编辑器对话框,和将要修改的方法:

代码修改完成以后,先点击“Accept”按钮,再点击“Exit”按钮,则退出编辑器,在 JShell 命令行中提示方法已经修改。

JShell Edit Pad 编辑器功能非常有限,仅能提供一些最基础的功能,不过好消息是,JShell 可以配置外部的代码编辑器,我们只需要使用/edit 外部编辑器的完整路径的方式,来指定外部的代码编辑器。

例如,我想使用Sublimet Text 作为外部的代码编译器,则需要使用如下命令:

/set editor "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"

设置成功以后,返回如下信息:

然后我们再执行/edit calculateRectangleArea命令,则就打开 Sublime Text,

9. 从外部加载源代码

如果我们已经有写好的 Java 文件,可以使用/open 命令导入到 JShell 环境中,例如我现在有一个Begin.java文件,

void printHello() {
System.out.println("Hello, World!");
} printHello()

在 JShell 环境中执行以下语句:

/open /Users/i324779/Desktop/Begin.java

加载文件并执行:

Java 9 尝鲜之JShell交互式编程环境的更多相关文章

  1. Java SE 9(JDK9)环境安装及交互式编程环境Jshell使用示例

    目的 安装JDK 9, 练习Jshell工具的使用, 体验Java的交互式编程环境. 什么是Jshell 其实就是一个命令行工具,安装完JDK9后,可以在bin目录下找到该工具,与Python的解释器 ...

  2. 一文学会Java的交互式编程环境jshell

    什么是交互式编程环境?重点词交互,在这样的编程环境中,你每输入一行代码,环境都会给你一个反馈,这就是交互式的编程环境.这种编程环境并不太适合工程化的复杂性需求,但在一些快速验证.简单计算之类的场景下还 ...

  3. Java lambda尝鲜

    最近Java 11都出来了,java 8 的很多新特性还没用过,比如接口可以有方法体啦,default默认方法. 当然最大的特性就是支持函数式编程了.Java 8 提供了lambda表达式和方法引用来 ...

  4. 尝鲜delphi开发android/ios_环境搭建

    Delphi这又老树发新枝了,开始做终端程序开发了,这个东西的准确名字是:RAD Studio XE5,可以使用delphi和c++ builder进行终端开发. 我尽可能讲啰嗦一些,免得回头被人问. ...

  5. Cocos2d-x v3.0正式版尝鲜体验【1】 环境搭建和新建项目

    Cocos2d-x v3.0在前天最终公布正式版了,等了大半年最终出来了.一直没去碰之前的3.0各种beta,rc版本号,就想等正式版出来再尝试. 昨天也參加了触控科技在成都举办的沙龙活动.看到作者王 ...

  6. Istio 1.1尝鲜记

    近几天Istio1.1的发布引起了技术界巨大的反响,为了让更多技术爱好者能够亲自体验Istio1.1,公司的技术大佬赶出了这篇尝鲜教程,其中包括环境.安装.可能遇到的问题及解决方式等,希望对大家有所帮 ...

  7. Spark 的 python 编程环境

    Spark 可以独立安装使用,也可以和 Hadoop 一起安装使用.在安装 Spark 之前,首先确保你的电脑上已经安装了 Java 8 或者更高的版本. Spark 安装 访问Spark 下载页面, ...

  8. Python 编程环境搭建(Windows 系统中)

    由于大家普遍使用 Windows 系统,所以本文只介绍 Windows 系统中 Python 环境的安装. 在 Windows 中安装 Python 与安装普通软件没什么差别,下载所需版本的安装包后, ...

  9. JEP解读与尝鲜系列4 - Java 16 中对于 Project Valhalla 的铺垫

    这是 JEP 解读与尝鲜系列的第 4 篇,之前的文章如下: JEP解读与尝鲜系列 1 - Java Valhalla与Java Inline class JEP解读与尝鲜系列 2 - JEP 142 ...

随机推荐

  1. Zabbix简介及安装

    前言 未经监控就上线的系统,就是裸奔,耍流氓. 监控对我们来说太重要了,监控工具也有很多,像,Cacti,Nagios,Ganglia,Zabbix等等,今天我们要介绍的是Zabbix,它的功能很强大 ...

  2. SQL SERVER 事务日志 解析

    1 基本介绍 每个数据库都具有事务日志,用于记录所有事物以及每个事物对数据库所作的操作. 日志的记录形式需要根据数据库的恢复模式来确定,数据库恢复模式有三种: 完整模式,完全记录事物日志,需要定期进行 ...

  3. 高精度模板 Luogu P1932 A+B & A-B & A*B & A/B Problem

    P1932 A+B & A-B & A*B & A/B Problem 题目背景 这个题目很新颖吧!!! 题目描述 求A.B的和差积商余! 输入输出格式 输入格式: 两个数两行 ...

  4. MAC本如何优雅的创建定时任务

    在MACOS上设置定时任务大体有两种方案.一种是使用crontab,一种是使用Schedule,今天结合我的使用简单介绍一下. 先说一下背景,为什么MAC可以用crontab.如果使用过Linux的同 ...

  5. error LNK2001: unresolved external symbol __beginthreadex

    解决方法: project->settings->C++>category->code generation->Use runtime library选Debug Mul ...

  6. python pytesser 的安装

      安装包: 需要安装的包主要有两个: PIL 和 pytesser . PIL模块的安装不多说 pytesser 模块的安装: 下载后得到 "pytesser_v0.0.1.zip&quo ...

  7. 3097: Hash Killer I

    3097: Hash Killer I Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 425  Solved: 15 ...

  8. 超出父视图无法点击问题hitTest

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c91b13 } p.p2 { margin: 0.0px 0. ...

  9. PHP随机数安全

    0x00 rand()函数 rand()的随机数默认最大32767,可以用于爆破这里不再举例. 0x01 mt_rand()和mt_srand()函数 mt_srand()函数用于播种,PHP 4.2 ...

  10. 一种抛弃GPS的中近距离高精度无线同步新方案

    目前,对于需要做同步数据采集的项目,大家不约而同的选用GPS作同步源,用GPS的秒脉冲作同步基准.对于是1000米内的多采集点的应用来说,这是一种浪费. 目前福州慧聚通信技术有限公司推出一款无线同步数 ...