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

时间:2019-03-01 21:54:51

标签: java-9 java-11 java-10 jshell

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

    }

1 个答案:

答案 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.javaIJavaExecutionControlProvider.java,如果您有兴趣使用任何一种方法(MIT许可证),请在CodeEvaluator.java#L72中使用示例用法。