JavaShell使用指南
立即解锁
发布时间: 2025-08-18 02:22:45 阅读量: 2 订阅数: 8 

### Java Shell 使用指南
#### 1. 表达式求值
在 Java Shell(jshell)中,你可以执行任何有效的 Java 表达式。以下是一些示例:
```java
jshell> 2 + 2
$1 ==> 4
jshell> 9.0 * 6
$2 ==> 54.0
```
当你计算表达式时,如果表达式有返回值,jshell 会给出反馈。在上述例子中,`2 + 2` 的结果是 `4`,`9.0 * 6` 的结果是 `54.0`。表达式的结果会被赋值给一个变量,反馈信息中包含变量名和表达式的值。例如,`$1 ==> 4` 表示 `2 + 2` 的结果是 `4`,并且该结果被赋值给了名为 `$1` 的变量。
你可以在其他表达式中使用这些变量名,也可以通过输入变量名来打印它们的值:
```java
jshell> $1
$1 ==> 4
jshell> $2
$2 ==> 54.0
jshell> System.out.println($1)
4
jshell> System.out.println($2)
54.0
```
**提示**:在 jshell 中,你不需要像在 Java 程序中那样用分号结束语句,该工具会自动为你插入缺失的分号。
在 Java 中,每个变量都有数据类型。在上述例子中,变量 `$1` 和 `$2` 的数据类型分别是什么呢?在 Java 中,`2 + 2` 的结果是 `int` 类型,`9.0 * 6` 的结果是 `double` 类型。因此,`$1` 和 `$2` 的数据类型分别应该是 `int` 和 `double`。你可以通过以下两种方式验证:
- **复杂方式**:将 `$1` 和 `$2` 强制转换为 `Object` 类型,然后调用 `getClass()` 方法:
```java
jshell> 2 + 2
$1 ==> 4
jshell> 9.0 * 6
$2 ==> 54.0
jshell> ((Object)$1).getClass()
$3 ==> class java.lang.Integer
jshell> ((Object)$2).getClass()
$4 ==> class java.lang.Double
```
- **简单方式**:设置 jshell 的反馈模式为详细模式,它会打印出创建的变量的数据类型:
```java
jshell> /set feedback verbose
| Feedback mode: verbose
jshell> 2 + 2
$1 ==> 4
| created scratch variable $1 : int
jshell> 9.0 * 6
$2 ==> 54.0
| created scratch variable $2 : double
```
如果你想让详细反馈模式在 jshell 会话中持续生效,可以使用以下命令:
```java
jshell> /set feedback -retain verbose
```
你还可以使用 `/vars` 命令列出 jshell 中定义的所有变量:
```java
jshell> /vars
| int $1 = 4
| double $2 = 54.0
```
如果你想恢复正常反馈模式,可以使用以下命令:
```java
jshell> /set feedback -retain normal
| Feedback mode: normal
```
jshell 不仅可以计算简单的表达式,还可以计算任何 Java 表达式。以下示例展示了字符串拼接、调用 `String` 类的方法以及使用 `for` 循环:
```java
jshell> "Hello " + "world! " + 2016
$1 ==> "Hello world! 2016"
jshell> $1.length()
$2 ==> 17
jshell> $1.toUpperCase()
$3 ==> "HELLO WORLD! 2016"
jshell> $1.split(" ")
$4 ==> String[3] { "Hello", "world!", "2016" }
jshell> for(String s : $4) {
...> System.out.println(s);
...> }
Hello
world!
2016
```
#### 2. 代码片段列表
在 jshell 中输入的任何内容都会成为一个代码片段(snippet)。每个代码片段都会被分配一个唯一的 ID,你可以在后续引用该代码片段,例如删除它。`/list` 命令可以列出所有代码片段,它有以下几种形式:
- `/list`
- `/list -all`
- `/list -start`
- `/list <snippet-name>`
- `/list <snippet-id>`
不带参数或选项的 `/list` 命令会打印所有用户输入的、活跃的代码片段,这些代码片段也可能是使用 `/open` 命令从文件中打开的。
使用 `-all` 选项可以列出所有代码片段,包括活跃的、不活跃的、有错误的和启动时的代码片段。
使用 `-start` 选项可以只列出启动时的代码片段。启动时的代码片段会被缓存,即使你在当前会话中删除了它们,`-start` 选项仍然会打印这些缓存的代码片段。
部分代码片段类型有名称(例如变量/方法声明),所有代码片段都有 ID。使用 `/list` 命令加上代码片段的名称或 ID 可以打印出对应的代码片段。
`/list` 命令会以以下格式打印代码片段列表:
```plaintext
<snippet-id> : <snippet-source-code>
<snippet-id> : <snippet-source-code>
<snippet-id> : <snippet-source-code>
...
```
JShell 工具会生成唯一的代码片段 ID。启动时的代码片段 ID 为 `s1`, `s2`, `s3`...,有效的代码片段 ID 为 `1`, `2`, `3`...,有错误的代码片段 ID 为 `e1`, `e2`, `e3`...。以下是一个 jshell 会话示例,展示了如何使用 `/list` 命令列出代码片段,以及如何使用 `/drop` 命令删除代码片段:
```java
C:\Java9Revealed>jshell
| Welcome to JShell -- Version 9-ea
| For an introduction type: /help intro
jshell> /list
jshell> 2 + 2
$1 ==> 4
jshell> /list
1 : 2 + 2
jshell> int x = 100
x ==> 100
jshell> /list
1 : 2 + 2
2 : int x = 100;
jshell> /list -all
s1 : import java.io.*;
s2 : import java.math.*;
s3 : import java.net.*;
s4 : import java.nio.file.*;
s5 : import java.util.*;
s6 : import java.util.concurrent.*;
s7 : import java.util.function.*;
s8 : import java.util.prefs.*;
s9 : import java.util.regex.*;
s10 : import java.util.stream.*;
1 : 2 + 2
2 : int x = 100;
jshell> /list -start
s1 : import java.io.*;
s2 : import java.math.*;
s3 : import java.net.*;
s4 : import java.nio.file.*;
s5 : import java.util.*;
s6 : import java.util.concurrent.*;
s7 : import java.util.function.*;
s8 : import java.util.prefs.*;
s9 : import java.util.regex.*;
s10 : import java.util.stream.*;
jshell> string str = "using invalid type string"
| Error:
| cannot find symbol
| symbol: class string
| string str = "using invalid type string";
| ^----^
jshell> /list
1 : 2 + 2
2 : int x = 100;
jshell> /list -all
s1 : import java.io.*;
s2 : import java.math.*;
s3 : import java.net.*;
s4 : import java.nio.file.*;
s5 : import java.util.*;
s6 : import java.util.concurrent.*;
s7 : import java.util.function.*;
s8 : import java.util.prefs.*;
s9 : import java.util.regex.*;
s10 : import java.util.stream.*;
1 : 2 + 2
2 : int x = 100;
e1 : string str = "using invalid type string";
jshell> /drop 1
| dropped variable $1
jshell> /list
2 : int x = 100;
jshell> /drop x
| dropped variable x
jshell> /list
jshell> /list -all
s1 : import java.io.*;
s2 : import java.math.*;
s3 : import java.net.*;
s4 : import java.nio.file.*;
s5 : import java.util.*;
s6 : import java.util.concurrent.*;
s7 : import java.util.function.*;
s8 : import java.util.prefs.*;
s9 : import java.util.regex.*;
s10 : import java.util.stream.*;
1 : 2 + 2
2 : int x = 100;
e1 : string str = "using invalid type string";
```
变量、方法和类的名称会成为代码片段的名称。需要注意的是,Java 允许变量、方法和类使用相同的名称,因为它们处于不同的命名空间中。你可以使用 `/list` 命令加上这些实体的名称来列出对应的代码片段:
```java
C:\Java9Revealed>jshell
| Welcome to JShell -- Version 9-ea
| For an introduction type: /help intro
jshell> /list x
| No such snippet: x
jshell> int x = 100
x ==> 100
jshell> /list x
1 : int x = 100;
jshell> void x(){}
| created method x()
jshell> /list x
1 : int x = 100;
2 : void x(){}
jshell> void x(int n) {}
| created method x(int)
jshell> /list x
1 : int x = 100;
2 : void x(){}
3 : void x(int n) {}
jshell> class x{}
| created class x
jshell> /list x
```
0
0
复制全文
相关推荐









