JShell 入门第 3 部分

发布日期:2026-07-13 10:17:03   来源 : 杭州电子商务研究院    浏览量 :12
杭州电子商务研究院 发布日期:2026-07-13 10:17:03  
12

前言

在本系列的前一篇指南中,您学习了JShell 的基础知识

在本指南中,您将学习如何管理代码片段并使用 JShell 探索库。

管理代码片段

JShell 本身还有一些命令。你可以输入/help/?查看完整列表:

      jshell> /help
|  Type a Java language expression, statement, or declaration.
|  Or type one of the following commands:
|  /list [<name or id>|-all|-start]
|       list the source you have typed
| ...
    

最有用的命令可能是那些可以帮助您管理代码片段的命令。

第一个是list,它默认列出自启动会话以来您输入的所有有效语句:

      jshell> /list

   1 : "Hello World"
   2 : $1
   3 : System.out.println($1)
    

还有另一个命令可以执行类似的操作:/history。 不同之处在于/history会显示您输入的所有语句(有效或无效)和命令:

      jshell> /history
/help
"Hello World"
$1
System.out.println($1)
Sys
/list
/history
    

您还可以使用/var仅列出变量,使用/methods仅列出方法,或使用/types仅列出类型

      jshell> /vars
|    String $1 = "Hello World"
    

但是, /list的优点是它显示了每个代码片段的数字标识符,您可以使用/<id>重新运行它:

      jshell> /3
System.out.println($1)
Hello World
    

使用/drop命令将其删除:

      jshell> /drop 2

jshell> /list

   1 : "Hello World"
   3 : System.out.println($1)
    

或者编辑它:

      jshell> /edit 1
    

在这种情况下,将打开一个带有简单编辑器的窗口,可帮助您修改代码片段:

此编辑器可方便地添加或修改多行语句(如类或方法),并且直到您单击退出(保存更改)或取消(放弃更改)按钮时它才会关闭。

但是,对于隐式变量,请注意 JShell 不会修改变量,而是创建另一个具有新值的变量:

      jshell> /edit 1
$4 ==> "Hello World modified"

jshell> /list

   1 : "Hello World"
   3 : System.out.println($1)
   4 : "Hello World modified";

jshell>
    

对于明确命名的变量或类型,不会发生这种情况。

您还可以在这些命令中使用变量或类型的名称。例如,使用上一节中定义的Book类:

      jshell> class Book {
   ...> private String title;
   ...> public void setTitle(String title) { this.title = title; }
   ...> public String getTitle() { return title; }
   ...> }
|  created class Book

jshell> /list

   1 : "Hello World"
   3 : System.out.println($1)
   4 : "Hello World modified";
   5 : class Book {
       private String title;
       public void setTitle(String title) { this.title = title; }
       public String getTitle() { return title; }
       }

jshell>
    

我们可以用以下命令来编辑它:

      jshell> /edit Book
    

如果我们这样修改这个类:

      class Book {
private String title = "<NO TITLE>";
public void setTitle(String title) { this.title = title; }
public String getTitle() { return title; }
public String toString() { return "Book: " + title; }
}
    

并且点击Exit,JShell 将更新类的定义(注意 ID 也发生了变化):

      jshell> /edit Book
|  replaced class Book

jshell> /list

   1 : "Hello World"
   3 : System.out.println($1)
   4 : "Hello World modified";
   6 : class Book {
       private String title = "<NO TITLE>";
       public void setTitle(String title) { this.title = title; }
       public String getTitle() { return title; }
       public String toString() { return "Book: " + title; }
       }
    

如果您执行不带参数的/edit命令,编辑器将允许您修改会话中的所有当前语句(如果需要,甚至可以添加一些语句):

使用 JShell 探索库

如前所述,JShell 在帮助我们探索新库方面做得非常出色。因此,我们假设我们想尝试一下Guava库。

您可以在此处下载Guava 23.0(目前最新版本)的JAR文件

在 JShell 会话中,默认情况下您会获得以下一组导入:

      jshell> /imports
jshell> /imports
|    import java.io.*
|    import java.math.*
|    import java.net.*
|    import java.nio.file.*
|    import java.util.*
|    import java.util.concurrent.*
|    import java.util.function.*
|    import java.util.prefs.*
|    import java.util.regex.*
|    import java.util.stream.*
    

您可以导入其他包,但是 JShell 如何知道在哪里寻找自定义包?

请考虑以下情况:

      jshell> import com.mycompany.*
    

您要做的是使用/env -class-path <path>命令(如果我们已经启动了 JShell 会话)或选项$jshell --class-path <path>(在命令行上)将包添加到 JShell 类路径。

您可以指定一个目录(在此示例中,它是当前目录):

      jshell> /env -class-path .
    

或者用于搜索已编译类文件的目录、JAR 或 ZIP 存档列表(在 Linux/Mac 上,列表必须用:分隔;在 Windows 上,列表必须用 ; 分隔)。执行/help context可以了解更多信息

这样,假设你已经将 Guava JAR 下载到C:\中,我们可以执行以下命令:

      jshell> /env -class-path C:\guava-23.0.jar
|  Setting new options and restoring state.
    

从消息中可以看出,它将使用新的类路径设置恢复会话,这意味着它将运行到该点为止执行的所有有效代码片段。

如果您要测试的库依赖于其他库,则必须下载这些依赖项并将它们添加到类路径中。

现在,您可以从 Guava 的包中导入类。开始输入:

      jshell> import com.google.common.primitives.
    

然后按Tab 键,JShell 就会显示一些选项:

      jshell> import com.google.common.primitives.
Booleans               Bytes                  Chars                  Doubles                Floats
ImmutableDoubleArray   ImmutableIntArray      ImmutableLongArray     Ints                   Longs
Primitives             Shorts                 SignedBytes            UnsignedBytes          UnsignedInteger
UnsignedInts           UnsignedLong           UnsignedLongs
    

这就是 JShell 自动完成功能派上用场的地方。

JShell 的自动完成功能允许您查看:

  • 包中的类
  • 类成员
  • 方法所需的参数
  • 方法的
以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据