如何在JShell中加载外部文件?

问题描述

JShell是Java的交互式REPL命令行。

如果我的java类包含一些我想在.java文件中进行交互操作的方法,该如何在其中加载该文件

假设我有文件HelloWorld.java

class HelloWorld
{
    public static void main(String[] argsv)
    {
    }

    public static void doStuff()
    {
        System.out.println("Hello world");
    }
}

,我想加载JShell并能够从命令行调用doStuff()方法。我该怎么办?

文件JShell开头$ JShell HelloWorld.java无效。也没有classfile。我仍然从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运行该命令,并使用命令行加载文件:

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命令声明了该类。