sun.org.mozilla.javascript.internal.NativeObject vs org.mozilla.javascript.NativeObject

时间:2016-05-21 00:06:16

标签: rhino nashorn

我现在真的陷入了困境。

基本上我有一个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代码。

1 个答案:

答案 0 :(得分:0)

除非您因某些原因而遇到旧的JDK(jdk7或更低版​​本),否则我建议您转到jdk8u。您使用与JDK8 +捆绑在一起的符合ES 5.1的JS实现(Nashorn)。