javax.scripting 맵 구현에서 이상한 동작이 나타납니다.javax.scripting 자바 스크립트 환경에서 맵 가져 오기
온라인 예는 JS 환경 내 목록에 추가하는 example 보여
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);
지도 키를 얻을 수있는 방법은 없습니다 - 당신이 키를 반복하려고하면, 당신은 방법을 얻을 names-에
jsEngine.eval(" for (var k in m.keySet()){ println(k)};");
결과 : JS에서
notifyAll
removeAll
containsAll
contains
empty
equals
...
컨텍스트에서 m.get(key)
으로 맵의 값을 지정할 수는 있지만 m[key]
으로 설정하면 안됩니다. 키가 존재하지 않으면 오류가 발생합니다. 누구든지이 행동에 대해 밝히지 않습니까, 아니면 그냥 깨졌습니까? 감사.
매우 흥미로운 부분입니다. keySet 객체를 반복 할 수도 있습니다 (Rhino에서는 메서드를 반복 할 수 있습니다). 그러나 확실하지 않습니다. 그것을 시도해야합니다 – TheLQ