如何以编程方式将变量添加到从中调用某些代码的Shell?

时间:2017-10-17 17:51:41

标签: java java-9 jshell

使用jshell,有没有办法在解释器的范围内创建变量?我有类似

的东西
Map<String,Object> vars = loadVarsFromSomething();

我希望能够做类似

的事情
for ( Map.Entry<String,Object> key : vars )
{
  scope.put( key.getKey(), key.getValue() );
}

这可能吗?

请注意&#34;范围&#34;我指的是jshell解释器正在使用的Shell对象的实际范围。我需要获取一个shell的引用,该代码被调用,以便我可以创建看起来像的变量如果他们是由用户/来电者分配..

2 个答案:

答案 0 :(得分:5)

要从输入文件加载变量,您可以使用Jshell script本身。

假设名为some.jsh的Jshell脚本需要提供两个变量,其中一个是String,另一个是原始整数。

// Random stuff initially
{
  System.out.println("One Jshell Script");
}
// Variables to be supplied when jshell loads.
int x = 10;
String y = "Cool";

使用以下命令执行上述脚本:

jshell some.jsh 

此后,您可以使用其标识符访问这些变量,如下所示: -

enter image description here

毫无疑问,您可以使用更复杂的数据结构(在您的情况下为Map<String,Object> vars)以及在脚本中存储信息。

答案 1 :(得分:1)

不,我不相信你可以做你想要的。我不确定您的用例是什么,但也许您可以使用以下代码段来获取想法:

jshell> /vars 
|    HashMap<String, Object> vars = {bar=2, foo=1}

jshell> try (PrintStream out = new PrintStream(new FileOutputStream("tmp.jsh"))) {
...>     vars.forEach((k, v) -> out.printf("Object %s = vars.get(\"%s\")\n", k, k));
...> }

jshell> /open tmp.jsh

jshell> /vars 
|    HashMap<String, Object> vars = {bar=2, foo=1} 
|    Object bar = 2 
|    Object foo = 1

jshell>