你如何在 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 本身的一些特定问题。