从jShell脚本内部,是否可以访问或注册在创建JShell的代码中定义的变量?
目前似乎没有机制可以访问变量或将变量注册到 Shell 实例,或者从 JShell 内部不返回任何字符串类型(如对象或 lambda 等)。
前任:
import jdk.jshell.JShell; import jdk.jshell.JShellException; import jdk.jshell.SnippetEvent; import java.util.List; 公共类 主 { public static void main(String[] args) 抛出 JShellException { var localVar = 1; JShell shell = JShell.create(); 如何使用 shell 实例注册本地 Var 变量或从作用域访问变量 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
类中的静态字段,然后使用Main.localVar
从 JShell 代码的"内部"访问它。
遗憾的是,由于 API 旨在支持可能位于不同进程甚至不同计算机中的执行提供程序,因此返回类型为字符串。如果您对黑客感兴趣,IJava jupyter 内核需要返回Object
的eval
实现,该最终使用基于DirectExecutionControl
的ExecutionControl
实现,该将eval
调用的结果存储在映射中并返回唯一 id 以引用该结果。然后使用 shell,您必须从eval
返回的 id 中查找结果(想想像results.get(eval(sourceCode))
这样的东西)。该实现在 IJavaExecutionControl 和 IJavaExecutionControlProvider 的 github 上.java.java如果您有兴趣获取其中任何一个(MIT 许可证),可以在 CodeEvaluator.java#L72 中提供示例用法。