从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()); } }
虽然您无法访问示例中的本地名称,但您可以创建一个在创建它的同一JVM中执行的JShell实例。为此你将使用LocalExecutionControl
。使用此执行控件,您可以将localVar
移动到Main
类中的静态字段,然后使用Main.localVar
从JShell代码的“内部”访问它。
不幸的是,由于API旨在支持可能位于不同进程或甚至是不同计算机的执行提供程序,因此返回类型是一个字符串。如果你对hack感兴趣,Ijava jupyter内核需要eval
的实现返回一个Object
,最后使用基于ExecutionControl
的DirectExecutionControl
实现,它在地图中存储了eval
调用的结果并返回了一个唯一的id参考结果。然后使用shell你必须从eval
返回的id中查找结果(想想像results.get(eval(sourceCode))
这样的东西)。如果您有兴趣参加任何一项(麻省理工学院执照),该实施是on github in IJavaExecutionControl.java和IJavaExecutionControlProvider.java,并在CodeEvaluator.java#L72中使用样本。