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());
}
}
虽然您无法像示例中那样访问本地名称,但您可以创建一个 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.java和IJavaExecutionControlProvider.java中,如果您有兴趣获取其中任何一个(MIT 许可证),则可以在CodeEvaluator.java#L72中找到示例用法。
| 归档时间: |
|
| 查看次数: |
112 次 |
| 最近记录: |