Я вижу некоторое нечетное поведение в реализации карты javax.scripting.
В онлайн-примерах показано пример добавления в список в среде js:
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
List<String> namesList = new ArrayList<String>();
namesList.add("Jill");
namesList.add("Bob");
namesList.add("Laureen");
namesList.add("Ed");
jsEngine.put("namesListKey", namesList);
System.out.println("Executing in script environment...");
try
{
jsEngine.eval("var names = namesListKey.toArray();" + "for(x in names) {" + " println(names[x]);" + "}"
+ "namesListKey.add(\"Dana\");");
} catch (ScriptException ex)
{
ex.printStackTrace();
}
System.out.println(namesList);
Однако, если вы попытаетесь сделать что-то подобное с картой, вы увидите странное поведение. Во-первых, если вы пытаетесь выполнить итерацию с помощью клавиш карты, например
HashMap<String, Object> m = new HashMap<String, Object>();
jsEngine.put("map", m);
Нет способа получить ключи карты - если вы попытаетесь выполнить итерацию по клавишам, вы получите имена методов -
jsEngine.eval(" for (var k in m.keySet()){ println(k)};");
приводит к:
notifyAll
removeAll
containsAll
contains
empty
equals
...
В контексте js вы можете адресовать значения на карте с помощью m.get(key)
, но не с m[key]
, и если ключ не существует, он выдает ошибку. Может ли кто-нибудь пролить свет на это поведение, или он просто сломан? Спасибо.