gpt4 book ai didi

java-9 - JShell 访问 jshell 实异常(exception)部定义的变量

转载 作者:行者123 更新时间:2023-12-02 01:00:23 24 4
gpt4 key购买 nike

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

目前似乎没有机制可以访问或向 Shell 实例注册变量,或者从 JShell 内部返回任何字符串类型(如对象或 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 。使用此执行控制,您可以移动 localVarMain 中的静态字段类,然后从 JShell 代码“内部”访问它 Main.localVar .

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

关于java-9 - JShell 访问 jshell 实异常(exception)部定义的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57772395/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com