JShell 访问在 jshell 实例之外定义的变量
JShell access to variables defined outside of jshell instance
在 jShell 脚本中,是否可以访问或注册在同时创建 JShell 的代码中定义的变量?
目前似乎没有机制可以从 JShell 内部访问或注册变量到 Shell 实例,或 return none 字符串类型(比如对象或 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());
}
}
虽然您无法像示例中那样访问本地名称,但您可以创建一个 JShell 实例,该实例在创建它的同一 JVM 中执行。为此,您将使用 LocalExecutionControl
。使用此执行控件,您可以将 localVar
移动到 Main
class 中的静态字段,然后使用 Main.localVar
从 "inside" JShell 代码访问它。
不幸的是,API 旨在支持可能位于不同进程甚至不同机器中的执行提供程序,因此 return 类型是一个字符串。如果您对 hack 感兴趣,IJava jupyter 内核需要 eval
的实现 returned 一个 Object
最终使用基于 ExecutionControl
的实现=17=] 将 eval
调用的结果存储在映射中,并 returned 了一个唯一的 id 来引用该结果。然后使用 shell 你将不得不从由 eval
编辑的 id return 中查找结果(想想像 results.get(eval(sourceCode))
这样的东西)。该实现是 on github in IJavaExecutionControl.java and IJavaExecutionControlProvider.java with a sample usage in CodeEvaluator.java#L72 如果您有兴趣获得其中的任何一个(麻省理工学院许可证)。
在 jShell 脚本中,是否可以访问或注册在同时创建 JShell 的代码中定义的变量?
目前似乎没有机制可以从 JShell 内部访问或注册变量到 Shell 实例,或 return none 字符串类型(比如对象或 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()); } }
虽然您无法像示例中那样访问本地名称,但您可以创建一个 JShell 实例,该实例在创建它的同一 JVM 中执行。为此,您将使用 LocalExecutionControl
。使用此执行控件,您可以将 localVar
移动到 Main
class 中的静态字段,然后使用 Main.localVar
从 "inside" JShell 代码访问它。
不幸的是,API 旨在支持可能位于不同进程甚至不同机器中的执行提供程序,因此 return 类型是一个字符串。如果您对 hack 感兴趣,IJava jupyter 内核需要 eval
的实现 returned 一个 Object
最终使用基于 ExecutionControl
的实现=17=] 将 eval
调用的结果存储在映射中,并 returned 了一个唯一的 id 来引用该结果。然后使用 shell 你将不得不从由 eval
编辑的 id return 中查找结果(想想像 results.get(eval(sourceCode))
这样的东西)。该实现是 on github in IJavaExecutionControl.java and IJavaExecutionControlProvider.java with a sample usage in CodeEvaluator.java#L72 如果您有兴趣获得其中的任何一个(麻省理工学院许可证)。