gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:29:16 25 4
gpt4 key购买 nike

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

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

前任:

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

导入 java.util.List;

公共(public)类主要{

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

}

最佳答案

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

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

关于java-9 - JShell 访问在 jshell 实例之外定义的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54952810/

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