Java 9 尝鲜之交互式编程环境
tookoa
8年前
<p style="text-align:center"><img src="https://simg.open-open.com/show/c1d9b869cfdc4d5375d69364f492f007.png"></p> <h3><strong>JShell——Java 9 的交互式编程环境</strong></h3> <p>本文要求读者有基本的 Java 知识。</p> <p>Tips</p> <p>Java 9 的代码由于提供了新特性,所以有些代码并不支持向后兼容。也就是说,用 Java 9 写的代码,有可能在 Java 8 或更早版本的 JDK 上不能运行。</p> <p><strong>1. 在操作系统上安装开发所需要的软件</strong></p> <p>首先,你需要下载 <strong>JDK 9</strong> ( <strong>Java Development Kit 9</strong> ) ,需要到此网站来 <a href="/misc/goto?guid=4958838556226034609" rel="nofollow,noindex">下载JDK 9</a> 。首先需要先同意许可协议,然后就可以下载了。</p> <p>Java 9 可以运行在很多平台上:</p> <ul> <li>Windows 32-bit</li> <li>Windows 64-bit</li> <li>macOS 64-bit (formerly known as Mac OS X or simply OS X)</li> <li>Linux 32-bit</li> <li>Linux 64-bit</li> <li>Linux on ARM 32-bit</li> <li>Linux on ARM 64-bit</li> </ul> <p>下一步需要配置 <strong>环境变量</strong> 。跟之前的 JDK 配置方法相同。这里,我以 macOS 10.12 版本为例,在 Macbook 上的配置。这里会需要 vi 的一些基本操作,可以去网上查找如何使用。</p> <ol> <li>下载完 JDK 后,直接运行。然后安装目录在:<br> /library/Java/JavaVirtualMachines/jdk-9.jdk/</li> <li>在 Terminal 下,进入到你的用户的当前目录下(一打开就是你的用户默认目录,实在不清楚在命令行敲入 cd 则会切换到默认目录下)。</li> <li>在命令行中执行 ls -a 命令,列出当前目录下的包括隐藏的文件或目录。</li> </ol> <p style="text-align:center"><img src="https://simg.open-open.com/show/1e93c6a4bae1eeaac6b9ef63ffec1f35.png"></p> <p style="text-align:center">ls -a</p> <p>4.找到 .bash_profile 文件,此文件会影响你当前用户的配置信息,并执行 vi .bash_profile 命令编辑此文件。</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/67f8ec004ed47c8c880a7a866f503eb7.png"></p> <p style="text-align:center">vi .bash_profile</p> <p>5.进入编辑页面后,配置 Java Home 和 Path 环境变量:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/6b827335cfdd73ec6234bc7c372d78be.png"></p> <p>配置 Java 环境变量</p> <p>6.配置完以后,使用 esc 键退出编辑状态,输入“:wq”,保存并退出。并执行</p> <p>. .bash_profile ,使配置文件立刻生效。</p> <ol> <li>在命令行下执行 javac -version ,如果输出如下信息,则说明 JDK 配置正确。</li> </ol> <p style="text-align:center"><img src="https://simg.open-open.com/show/0a23dc1c06766673af6a3c506d5b7819.png"></p> <p style="text-align:center">javac 9-ea</p> <p>至此,JDK 配置完成。</p> <p>启动JShell。</p> <p>在Terminal下输 jshell -v ,</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/50e0c16ee803a1c53b5712071ec8442e.png"></p> <p style="text-align:center">jshell</p> <p>此时,就进入JShell 开发环境,命令行里是以 jshell> 开头。</p> <p>如果想退出JShell 环境,则输入 /exit 命令。</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/7422a3d6150b79891ad53ae041f9a6c9.png"></p> <p style="text-align:center">退出 jshell</p> <p><strong>2. 理解在交互式编程环境下开发的好处</strong></p> <p>Java 9 中引入了交互式编程环境(REPL),这就是JShell,它允许可以执行 Java脚本代码,并且立即返回结果。因此,我们不需要创建什么一个解决方案或工程,就能很容易地编写代码并能很快的看到运行结果。我们不必等待整个项目 build 完去检查多行代码的执行结果。JShell,就像其他 REPL 一样,有利于探索式编程,我们很容易地进行交互式尝试和调试不同的算法和结构。</p> <p><strong>3. 第一个 JShell 下的 Java 代码</strong></p> <p>我们简单写一个 JShell 下的一个 Java 代码,就是一个打印输入。</p> <pre> <code class="language-java">System.out.println("Hello, Java 9, now I am in JShell!")</code></pre> <p>输出结果为:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/74f5b0baf338f46689a2ef3973948ca1.png"></p> <p style="text-align:center">第一个 JShell 下的 Java 代码</p> <p>Tips</p> <p>在 JShell 环境下,语句末尾的“;” 是可选的。但推荐还是最好加上。提高代码可读性。</p> <p>在一些例子中,我们将利用JShell 这一特性,提供对网络的访问。此功能与Web Service交互时非常有用。然而,你必须确保你的防火墙配置不会阻挡 JShell。</p> <p><strong>4. 查看默认导入和使用自动补全功能</strong></p> <p>默认情况下,JShell提供了一些常用包的导入,我们可以使用 import 语句导入必要的包或是从指定的路径的包,来运行我们的代码片段。我们可以输入以下命令列出所有导入的包:</p> <pre> <code class="language-java">/imports</code></pre> <p>下面就会列出已经导入的包:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/e79df9d9da545075289f9836b0c57b70.png"></p> <p style="text-align:center">imports</p> <p>当我们在 JShell 之外写 Java 代码时,如所需要的 java.lang 包是默认导入的。在 JShell 下使用 /imports 命令并没没有列出这些包,以下是所有的在 JShell 环境下默认导入的包:</p> <ul> <li>java.lang</li> <li>java.io</li> <li>java.math</li> <li>java.net</li> <li>java.nio.file</li> <li>java.util</li> <li>java.util.concurrent</li> <li>java.util.function</li> <li>java.util.prefs</li> <li>java.util.regex</li> <li>java.util.stream</li> </ul> <p>此外,JShell 提供了自动补全的功能,只需按下 Tab 键,就能自动补全。</p> <p>但有些情况下,根据我们输入的语句会对应很多选项,这时候 JShell 就会全部给你列出来。</p> <p>例如,当我输入 S 时,就会列出来所以以 S 开头的类。</p> <p><img src="https://simg.open-open.com/show/afe50903114a11582357218ec9338a24.png"></p> <p style="text-align:center">自动补全</p> <p>当我们想输入 System 类时,根据前面说的自动补全,只需要输入 Sys 然后按下 Tab 键,则自动补全, 然后再输入“.o”,则会自动补全方法, 在补全“System.out.”后按下 Tab 键,接下来就会列出当前类的所有的 public 方法的列表。</p> <p><img src="https://simg.open-open.com/show/135034202ce418a4a48bdb4afe96cf67.png"></p> <p style="text-align:center">list method</p> <p>最后完整输入:</p> <pre> <code class="language-java">System.out.println("Auto-complete is helpful in JShell");</code></pre> <p><strong>5. 在JShell中编写 Java 9 代码</strong></p> <p>首先,在命令行下可以执行 jshell -v 来进入命令行的开发环境。</p> <p>下面我们定义 calculateRectangleArea 方法来计算一个正方形的面积。</p> <pre> <code class="language-java">float calculateRectangleArea(float width, float height) { return width * height; }</code></pre> <p><img src="https://simg.open-open.com/show/8d9bcc67a8df3163ea5c75f523fbfd41.png"></p> <p style="text-align:center">calculateRectangleArea</p> <p>然后输入回车,则会输入如下信息:</p> <p><img src="https://simg.open-open.com/show/ecc0b3be4a7ecff22261c86de4b98d1d.png"></p> <p style="text-align:center">created calculateRectangleArea</p> <p>Tips</p> <p>所有从 JShell 输出的消息用“|”表示。</p> <p>输入 /list 在 JShell 中,会列出到目前为止当前 session 里所有有效的代码片段。</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/971657906ba21ac3bb0f0f49fe0fd594.png"></p> <p style="text-align:center">/list</p> <p>接下来我们定义一个 float类型的变量 width 并赋值为50:</p> <pre> <code class="language-java">float width = 50;</code></pre> <p>输入完上面的代码后,JShell 就会给我们如下信息:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/64499f91bcaa47d8b358de137f81684d.png"></p> <p style="text-align:center">width</p> <p>然后定义 height 变量:</p> <pre> <code class="language-java">float height = 25;</code></pre> <p>接着输入 float area = ca 然后自动补全为 float area = calculateRectangleArea( ,再输入刚才定义的变量 width 和 height ,则方法则计算出面积并返回1250.0。</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/97fc2d08db691d10065981acb4f288ed.png"></p> <p style="text-align:center">Area</p> <p>下面我们再使用 /list 列出到目前为止所有有效的代码片段。</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/475c6e6591684e8b13e26793cf83507d.png"></p> <p style="text-align:center">list again</p> <p>输入以下代码:</p> <pre> <code class="language-java">System.out.printf("Width: %.2f, Height: %.2f, Area: %.2f\n", width, height, area);</code></pre> <p>则会输入如下信息:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/2bbab9a777a37a0eb1a6c52ff0932253.png"></p> <p style="text-align:center">width, height, area</p> <p><strong>6. 计算表达式</strong></p> <p>Java 9 中运行我们评估任何有效的表达式,在 JShell中输入如下表达式:</p> <pre> <code class="language-java">width * height;</code></pre> <p>当我们输入上面的表达式,它就会给分配给一个临时的变量,这个变量以“$”开头,并跟着一个数字。这个变量是$6,但也有可能是$7, $8。</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/a0f2a5f447ad82f6291c731b42f9adad.png"></p> <p>在当前 session 中,我们可以在接下来的代码中直接使用此临时变量,例如:</p> <pre> <code class="language-java">System.out.printf("The calculated area is %.2f\n", $6);</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/f5a5b2f2a793f368bcfebc8daf3c7984.png"></p> <p>我们还可以使用之前的临时变量进行响应的运算,例如,</p> <pre> <code class="language-java">$6 + 10.5f;</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/1aea77c12a00f3ae5ed4b826ac3db2f2.png"></p> <p><strong>7. 使用变量、方法和源代码</strong></p> <p>到目前为止,我们创建了很多变量,我们可以使用 /vars 来查看当前 session 下所有创建过的变量:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/01198efe412c58e7c302c515bee8f716.png"></p> <p style="text-align:center">/vars</p> <p>我们再定义一个方法:</p> <pre> <code class="language-java">float calculateRectanglePerimeter(float width, float height) { return 2 * (width + height); }</code></pre> <p>然后使用 /methods 来查看所有的方法。</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/d692a9255935119682f6e2f73ff93d8d.png"></p> <p style="text-align:center">/methods</p> <p>你也可以 修改已经存在的方法,例如, calculateRectanglePerimeter 的方法改为如下:</p> <pre> <code class="language-java">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; }</code></pre> <p>然后输出以下信息:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/ebd1d24191edde6e28df164dfca31897.png"></p> <p style="text-align:center">change method</p> <p>我们还可以使用 /list method name 来查看具体某一个方法的具体信息:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/95b259dd39c2706f51acce1d40054bb8.png"></p> <p style="text-align:center">/list method name</p> <p><strong>8. 使用外部代码编辑器来编写 Java 代码</strong></p> <p>现在,我想对 calculateRectangleArea 方法做一些改动,如果这时有外部代码编辑器的话,做起来会很容易。</p> <p>在 JShell 中可以启用JShell Edit Pad 编辑器,需要输入如下命令,来修改上面的方法:</p> <pre> <code class="language-java">/edit calculateRectangleArea</code></pre> <p>接下来就会显示编辑器对话框,和将要修改的方法:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/3338d2ceceac56b1da90c93cdfacca28.png"></p> <p style="text-align:center">JShell Edit Pad</p> <p>代码修改完成以后,先点击“Accept”按钮,再点击“Exit”按钮,则退出编辑器,在 JShell 命令行中提示方法已经修改。</p> <p>JShell Edit Pad 编辑器功能非常有限,仅能提供一些最基础的功能,不过好消息是,JShell 可以配置外部的代码编辑器,我们只需要使用 /edit 外部编辑器的完整路径 的方式,来指定外部的代码编辑器。</p> <p>例如,我想使用Sublimet Text 作为外部的代码编译器,则需要使用如下命令:</p> <pre> <code class="language-java">/set editor "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"</code></pre> <p>设置成功以后,返回如下信息:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/045e72c03156de07a0c1e64e69a71c32.png"></p> <p style="text-align:center">set editor</p> <p>然后我们再执行 /edit calculateRectangleArea 命令,则就打开 Sublime Text,</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/865a9df1af6f74c66fc5ce635d4575f5.png"></p> <p style="text-align:center">Sublime Text</p> <p><strong>9. 从外部加载源代码</strong></p> <p>如果我们已经有写好的 Java 文件,可以使用 /open 命令导入到 JShell 环境中,例如我现在有一个 Begin.java 文件,</p> <pre> <code class="language-java">void printHello() { System.out.println("Hello, World!"); } printHello()</code></pre> <p>在 JShell 环境中执行以下语句:</p> <pre> <code class="language-java">/open /Users/i324779/Desktop/Begin.java</code></pre> <p>加载文件并执行:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/0f23376cb325cd7060957ee0e43a3510.png"></p> <p> </p> <p>来自:http://www.techug.com/post/java9-repl-jshell.html</p> <p> </p>