JShell访问在jshell实例外部定义的变量

Dev*_*per 6 java-9 java-10 jshell java-11

从jShell脚本内部,是否可以访问或注册也在创建JShell的代码中定义的变量?

当前,似乎没有机制可以访问或向Shell实例注册变量,或者从JShell内部不返回任何字符串类型(例如对象或lambda等)。

例如:

    导入jdk.jshell.JShell;
    导入jdk.jshell.JShellException;
    导入jdk.jshell.SnippetEvent;

    导入java.util.List;


    公共班级主要{

        公共静态void main(String [] args)抛出JShellException {
            var localVar = 1;
            JShell shell = JShell.create();
            //如何在shell实例中注册localVar变量或从作用域访问变量
            列表事件= shell.eval(“ var x = localVar;”);
            SnippetEvent event = events.get(0);
            System.out.println(“种类:” + event.snippet()。kind()+“,值:” + event.value());
        }

    }

Spe*_*ark 5

虽然您无法像示例中那样访问本地名称,但您可以创建一个 JShell 实例,该实例在创建它的同一 JVM 中执行。为此,您将使用LocalExecutionControl. 使用此执行控制,您可以移动localVar到类中的静态字段Main,然后从 JShell 代码“内部”访问它Main.localVar.

不幸的是,由于 API 旨在支持可能位于不同进程甚至不同机器中的执行提供程序,因此返回类型是字符串。如果您对 hack 感兴趣,IJava jupyter 内核需要一个eval返回的实现Object,最终使用ExecutionControl基于DirectExecutionControl将调用结果存储eval在映射中并返回唯一 id 来引用该结果的实现。然后使用 shell,您必须从返回的 id 中查找结果eval(想想类似的东西results.get(eval(sourceCode)))。该实现位于github 上的 IJavaExecutionControl.javaIJavaExecutionControlProvider.java中,如果您有兴趣获取其中任何一个(MIT 许可证),则可以在CodeEvaluator.java#L72中找到示例用法。