你如何在 JShell 中加载外部文件?
How do you load an external file in JShell?
JShell 是 Java 的交互式 REPL 命令行。
如果我有一个 Java class 和一些我想在 .java 文件中交互使用的方法,我该如何加载该文件?
假设我有文件 HelloWorld.java
:
class HelloWorld
{
public static void main(String[] argsv)
{
}
public static void doStuff()
{
System.out.println("Hello world");
}
}
并且我想加载 JShell 并能够从命令行调用 doStuff()
方法。我该怎么做?
使用文件名 $ JShell HelloWorld.java
启动 JShell
无效。也没有 class 文件。我仍然从 JShell 收到错误 cannot find symbol | symbol: variable HelloWorld
。使用 /open <filename>
命令给出了相同的结果。
无法重现:问题中描述的问题(“无效”)不可重现,因为它没有问题。
这是一个 Minimal, Reproducible Example 的工作步骤,在 Java 9 和 Java 14 上进行测试。
首先,验证Java源文件的内容:
C:\Temp>type HelloWorld.java
class HelloWorld
{
public static void main(String[] argsv)
{
}
public static void doStuff()
{
System.out.println("Hello world");
}
}
我们可以 运行 使用来自 Java 9 的 JShell,使用 command-line:
加载文件
C:\Temp>jshell HelloWorld.java
| Welcome to JShell -- Version 9.0.4
| For an introduction type: /help intro
jshell> HelloWorld.doStuff()
Hello world
可以看出,Java 源文件加载得很好,调用 static
方法没有问题。
我们还可以 运行 使用来自 Java 14 的 JShell,使用 /open
命令加载文件:
C:\Temp>jshell
| Welcome to JShell -- Version 14
| For an introduction type: /help intro
jshell> HelloWorld.doStuff()
| Error:
| cannot find symbol
| symbol: variable HelloWorld
| HelloWorld.doStuff()
| ^--------^
jshell> /open HelloWorld.java
jshell> HelloWorld.doStuff()
Hello world
我们首先尝试在/open
命令之前运行,证明HelloWorld
不存在,即证明是/open
命令声明了class.
我遇到了与此类似的问题,但在我的情况下,无论出于何种原因,class 都不会通过 /open
命令加载,除非我从 class声明。我不知道这是否是我的 jshell
版本(MacOSX Catalina 上的 11.0.2 运行)中的一个错误,或者它是关于 jshell 本身的一些特定问题。
JShell 是 Java 的交互式 REPL 命令行。
如果我有一个 Java class 和一些我想在 .java 文件中交互使用的方法,我该如何加载该文件?
假设我有文件 HelloWorld.java
:
class HelloWorld
{
public static void main(String[] argsv)
{
}
public static void doStuff()
{
System.out.println("Hello world");
}
}
并且我想加载 JShell 并能够从命令行调用 doStuff()
方法。我该怎么做?
使用文件名 $ JShell HelloWorld.java
启动 JShell
无效。也没有 class 文件。我仍然从 JShell 收到错误 cannot find symbol | symbol: variable HelloWorld
。使用 /open <filename>
命令给出了相同的结果。
无法重现:问题中描述的问题(“无效”)不可重现,因为它没有问题。
这是一个 Minimal, Reproducible Example 的工作步骤,在 Java 9 和 Java 14 上进行测试。
首先,验证Java源文件的内容:
C:\Temp>type HelloWorld.java
class HelloWorld
{
public static void main(String[] argsv)
{
}
public static void doStuff()
{
System.out.println("Hello world");
}
}
我们可以 运行 使用来自 Java 9 的 JShell,使用 command-line:
加载文件C:\Temp>jshell HelloWorld.java
| Welcome to JShell -- Version 9.0.4
| For an introduction type: /help intro
jshell> HelloWorld.doStuff()
Hello world
可以看出,Java 源文件加载得很好,调用 static
方法没有问题。
我们还可以 运行 使用来自 Java 14 的 JShell,使用 /open
命令加载文件:
C:\Temp>jshell
| Welcome to JShell -- Version 14
| For an introduction type: /help intro
jshell> HelloWorld.doStuff()
| Error:
| cannot find symbol
| symbol: variable HelloWorld
| HelloWorld.doStuff()
| ^--------^
jshell> /open HelloWorld.java
jshell> HelloWorld.doStuff()
Hello world
我们首先尝试在/open
命令之前运行,证明HelloWorld
不存在,即证明是/open
命令声明了class.
我遇到了与此类似的问题,但在我的情况下,无论出于何种原因,class 都不会通过 /open
命令加载,除非我从 class声明。我不知道这是否是我的 jshell
版本(MacOSX Catalina 上的 11.0.2 运行)中的一个错误,或者它是关于 jshell 本身的一些特定问题。