我想使用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。