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

JShell access to variables defined outside of jshell instance

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

目前似乎没有机制可以从 JShell 内部访问或注册变量到 Shell 实例,或 return none 字符串类型(比如对象或 lambda 等)

例如:


    import jdk.jshell.JShell;
    import jdk.jshell.JShellException;
    import jdk.jshell.SnippetEvent;

    import java.util.List;


    public class Main {

        public static void main(String[] args) throws JShellException {
            var localVar = 1;
            JShell shell = JShell.create();
            // How to register localVar variable with shell instance or access variables from scope
            List events = shell.eval("var x = localVar;");
            SnippetEvent event = events.get(0);
            System.out.println("Kind: " + event.snippet().kind() + ", Value: " + event.value());
        }

    }

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

不幸的是,API 旨在支持可能位于不同进程甚至不同机器中的执行提供程序,因此 return 类型是一个字符串。如果您对 hack 感兴趣,IJava jupyter 内核需要 eval 的实现 returned 一个 Object 最终使用基于 ExecutionControl 的实现=17=] 将 eval 调用的结果存储在映射中,并 returned 了一个唯一的 id 来引用该结果。然后使用 shell 你将不得不从由 eval 编辑的 id return 中查找结果(想想像 results.get(eval(sourceCode)) 这样的东西)。该实现是 on github in IJavaExecutionControl.java and IJavaExecutionControlProvider.java with a sample usage in CodeEvaluator.java#L72 如果您有兴趣获得其中的任何一个(麻省理工学院许可证)。