Nashorn:JavaImporter在创建16个实例后停止工作

时间:2018-10-04 12:36:44

标签: javascript java nashorn

我想使用Nashorn评估一些JavaScript代码,而JavaScript代码使用一些Java对象。要访问Java对象,我在'with'语句中使用JavaImporter。看来,可以创建的“正在运行的” JavaImporter实例的数量在某种程度上被“限制”为16,如以下代码所示:

public void test() {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
    IntStream.range(0, 17).forEach(i ->
    {
        try {
            engine.eval("with (new JavaImporter(java.util)) {new ArrayList(Arrays.asList(\"a\", \"b\", \"c\"))}");
        } catch (ScriptException e) {
            System.err.println(i);
            e.printStackTrace();
        }
    });
}

执行此测试时,第16条路径将失败并显示:

16
javax.script.ScriptException: TypeError: function __noSuchMethod__() { [native code] } is not a constructor function in <eval> at line number 1
    at jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:470)
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:454)
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:406)
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:402)
    at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:155)
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
    at nashorn_test.lambda$test$0(nashorn_test.java:17)
    at java.util.stream.Streams$RangeIntSpliterator.forEachRemaining(Streams.java:110)
    at java.util.stream.IntPipeline$Head.forEach(IntPipeline.java:557)
    at nashorn_test.test(nashorn_test.java:14)

似乎无法再构造Java ArrayList。

为什么会这样?我如何才能运行测试?创建一个“全局” JavaImporter实例不是一种选择。我使用的是OpenJDK 1.8.0.171。

0 个答案:

没有答案