Veo un comportamiento extraño en la implementación del mapa javax.scripting.Importación de un mapa en javax.scripting entorno de JavaScript
Los ejemplos muestran una línea example de añadir a una lista dentro del entorno 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);
Sin embargo, si intenta hacer algo similar con un mapa, se ve un comportamiento extraño. Por un lado, si intenta iterar a través de las teclas del mapa, p.
HashMap<String, Object> m = new HashMap<String, Object>();
jsEngine.put("map", m);
No hay manera de obtener las claves mapa - si intenta iterar a través de las teclas, se obtiene método nombres-
jsEngine.eval(" for (var k in m.keySet()){ println(k)};");
resultados en:
notifyAll
removeAll
containsAll
contains
empty
equals
...
En el js context puede direccionar los valores en el mapa con m.get(key)
pero no con m[key]
, y si la clave no existe arroja un error. ¿Alguien puede arrojar algo de luz sobre este comportamiento, o simplemente está roto? Gracias.
Eso es muy interesante. Podría estar iterando sobre los objetos keySet (en Rhino puedes repetir los métodos), pero no estoy seguro. Tendré que probarlo – TheLQ