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

How to programatically add variables to the Shell from which some code was invoked?

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

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

我希望能够做类似

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

这可能吗?

注意这里我指的 "scope" 是 jshell 解释器正在使用的 Shell 对象的实际范围。我需要一个参考到从中调用代码的 shell,这样我就可以创建看起来好像是由 user/caller ..

分配的变量

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

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

// 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)以及在脚本中存储信息。

不,我认为不可能实现您的要求。我不确定你的用例到底是什么,但也许你可以使用以下代码片段来获取灵感:

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>