0

我无法在 Java 8 (IBM J9JVM) 中创建ScriptEnginenashorn在下面的代码中,引擎是null.

private static void runOther(String[] args){
    ScriptEngineManager engineManager = new ScriptEngineManager();
    ScriptEngine engine = engineManager.getEngineByName("nashorn");
    engine.eval("function sum(a, b) { return a + b; }");
}

这个失败是由我的库引入的,它为java.lang.invoke包中的 MethodHandle 执行字节码生成。我的图书馆的变化是:

  1. 更改仅适用于标准java.lang.invoke包。nashorn 没有任何变化。
  2. 当 nashorn 即将使用 设置调用站点的目标时Methodhandle target,我的库将转换target为另一个方法句柄b,如果从target创建GuardWithTestHandle并将调用站点的目标设置为b。两个“目标andb”具有相同的方法类型。

我的上一个版本库于 2016 年 10 月完成,对 Nashorn 来说还可以。但是我构建的新版本WrongMethodTypeException在执行时有getEngineByName. 此异常在内部处理getEngineByName并返回 null。

我得到的 nashorn 源代码与 JVM 中的 nashorn.jar 不一致。在调试过程中,我发现异常来自:

全局 = createNashornGlobal();

里面NashornScriptEngine.<init>UserAccessorProperty深入消化后,在(line318)处进行MethodHandle调用时抛出异常

/*     */   public Object getObjectValue(ScriptObject self, ScriptObject owner)
/*     */   {
/*     */     try {
/* 215 */       return invokeObjectGetter(getAccessors(owner != null ? owner : self), getObjectGetterInvoker(), self);  //owner and self are the same instance. 
/*     */     } catch (Error|RuntimeException t) {
/* 217 */       throw t;
/*     */     } catch (Throwable t) {
/* 219 */       throw new RuntimeException(t);
/*     */     }
/*     */   }


/*     */   private static Object invokeObjectGetter(Accessors gs, MethodHandle invoker, Object self)
/*     */     throws Throwable
/*     */   {
/* 316 */     Object func = getter;
/* 317 */     if ((func instanceof ScriptFunction)) {
/* 318 */       return invoker.invokeExact(func, self);
/*     */     }
/*     */     
/* 321 */     return ScriptRuntime.UNDEFINED;
/*     */   }

在第 318 行,invokerisMutableCallSiteDynamicInvokerHandle及其方法类型为(Object,Object)Objectfunc和都在这里self声明为Object对象,参数类型和返回值完全匹配。

我无法理解此异常,也不知道此问题的后续步骤。谢谢,如果你能在这里为这个问题提供一些想法和建议吗?或一些选项/配置..

见栈堆栈的调试屏幕截图

4

0 回答 0