JShell访问jshell实例外部定义的变量

问题描述 投票:4回答:1

从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());
        }

    }

java-9 java-11 java-10 jshell
1个回答
2
投票

虽然您无法访问示例中的本地名称,但您可以创建一个在创建它的同一JVM中执行的JShell实例。为此你将使用LocalExecutionControl。使用此执行控件,您可以将localVar移动到Main类中的静态字段,然后使用Main.localVar从JShell代码的“内部”访问它。

不幸的是,由于API旨在支持可能位于不同进程或甚至是不同计算机的执行提供程序,因此返回类型是一个字符串。如果你对hack感兴趣,Ijava jupyter内核需要eval的实现返回一个Object,最后使用基于ExecutionControlDirectExecutionControl实现,它在地图中存储了eval调用的结果并返回了一个唯一的id参考结果。然后使用shell你必须从eval返回的id中查找结果(想想像results.get(eval(sourceCode))这样的东西)。如果您有兴趣参加任何一项(麻省理工学院执照),该实施是on github in IJavaExecutionControl.javaIJavaExecutionControlProvider.java,并在CodeEvaluator.java#L72中使用样本。

© www.soinside.com 2019 - 2024. All rights reserved.