4

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

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

我希望能够做类似的事情

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

那可能吗?

请注意,我所指的“范围”是 jshell 解释器正在使用的Shell对象的实际范围。我需要获取对从中调用代码的 shell 的引用,以便我可以创建变量看起来好像它们是由用户/呼叫者分配的..

4

2 回答 2

5

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

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

// 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 

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

在此处输入图像描述

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

于 2017-10-23T03:42:44.467 回答
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>
于 2017-10-26T11:29:24.623 回答