Widzę dziwne zachowanie w implementacji mapy javax.scripting.Importowanie mapy w javax.scripting javascript
Przykłady forum pokazać example dodawania do listy w środowisku 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);
Jeśli jednak spróbować zrobić coś podobnego z mapą, widać dziwne zachowanie. Po pierwsze, jeśli próbujesz iterować za pomocą klawiszy mapy, np.
HashMap<String, Object> m = new HashMap<String, Object>();
jsEngine.put("map", m);
Nie ma sposobu, aby uzyskać klucze mapie - jeśli spróbujesz iterację kluczy, otrzymasz metodę names-
jsEngine.eval(" for (var k in m.keySet()){ println(k)};");
skutkuje:
notifyAll
removeAll
containsAll
contains
empty
equals
...
w js Kontekst można adres wartości na mapie z m.get(key)
, ale nie z m[key]
, a jeśli klucz nie istnieje, zgłasza błąd. Czy ktoś może rzucić trochę światła na to zachowanie, czy jest po prostu zepsuty? Dzięki.
To bardzo interesujące. Może to być iteracja nad obiektami keySet (w Rhino możesz zapętlać metody), ale nie jestem pewien. Będę musiał to wypróbować – TheLQ