JShell 入门第 3 部分
前言
在本系列的前一篇指南中,您学习了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> /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 的自动完成功能允许您查看:
- 包中的类
- 类成员
- 方法所需的参数
- 方法的
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~