在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()); } }
答案 0 :(得分:2)
虽然您不能像示例中那样访问本地名称,但是可以创建一个JShell实例,该实例在创建它的同一JVM中执行。为此,您将使用LocalExecutionControl
。使用此执行控件,您可以将localVar
移动到Main
类中的静态字段,然后使用Main.localVar
从JShell代码“内部”访问它。
不幸的是,由于API旨在支持可能位于不同进程甚至不同机器上的执行提供程序,因此返回类型为字符串。如果您对黑客感兴趣,那么IJava jupyter内核需要实现eval
的实现,该实现返回一个Object
,该最终使用基于ExecutionControl
的{{1}}实现将DirectExecutionControl
调用的结果存储在地图中,并返回唯一的ID以引用该结果。然后,使用外壳程序,您将不得不从eval
返回的id中查找结果(例如eval
之类的东西)。该实现是on github in IJavaExecutionControl.java和IJavaExecutionControlProvider.java,如果您有兴趣使用任何一种方法(MIT许可证),请在CodeEvaluator.java#L72中使用示例用法。