我无法在 Java 8 (IBM J9JVM) 中创建ScriptEngine
。nashorn
在下面的代码中,引擎是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 执行字节码生成。我的图书馆的变化是:
- 更改仅适用于标准
java.lang.invoke
包。nashorn 没有任何变化。 - 当 nashorn 即将使用 设置调用站点的目标时
Methodhandle target
,我的库将转换target
为另一个方法句柄b
,如果从target
创建GuardWithTestHandle
并将调用站点的目标设置为b
。两个“目标and
b”具有相同的方法类型。
我的上一个版本库于 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 行,invoker
isMutableCallSiteDynamicInvokerHandle
及其方法类型为(Object,Object)Object
。func
和都在这里self
声明为Object
对象,参数类型和返回值完全匹配。
我无法理解此异常,也不知道此问题的后续步骤。谢谢,如果你能在这里为这个问题提供一些想法和建议吗?或一些选项/配置..