我现在真的陷入了困境。
基本上我有一个Java Map,我想将它传递给Javascript代码,因此在我的JS代码中我可以使用点符号来引用此Map中的键。 (我知道我可以将地图序列化为JSON并将其反序列化并将其传递给JS,但我不喜欢它)我有这段单位代码
@Test
public void mapToJsTest() throws Exception{
Map m = Maps.newHashMap();
m.put("name", "john");
NativeObject nobj = new NativeObject();
for (Object k : m.keySet()) {
nobj.defineProperty((String)k, m.get(k), NativeObject.READONLY);
}
engine.eval("function test(obj){ return obj.name;}");
Object obj = ((Invocable)engine).invokeFunction("test", nobj);
Assert.assertEquals(obj, "john");
}
如果我正在使用 org.mozilla.javascript.NativeObject 然后测试不会通过,
但是,如果我正在使用 sun.org.mozilla.javascript.internal.NativeObject 然后测试将通过。
但是,我们都知道我们不应该依赖这些内部类,当我在服务器端部署代码时,尝试访问 这个内部类会引起其他问题。
那么如何使用“org.mozilla.javascript.NativeObject”实现这一目标呢?
BTW,我正在使用Rhino
ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
对于Nashorn来说,它更容易,我可以直接将Map传递给JS代码。
答案 0 :(得分:0)
除非您因某些原因而遇到旧的JDK(jdk7或更低版本),否则我建议您转到jdk8u。您使用与JDK8 +捆绑在一起的符合ES 5.1的JS实现(Nashorn)。