Beim Aufruf einer Java Funktion in JS ist es nicht möglich in verschiedenen Bereichen zu arbeiten (global/engine).java 8 - Übergabe einer Funktion durch Bindings
engine.eval("function proxy(a){return Java.type('Foo').bar(a);}",engine.getBindings(ScriptContext.GLOBAL_SCOPE));
engine.eval("function withoutProxy(){return Java.type('Foo').bar(m);}",engine.getBindings(ScriptContext.ENGINE_SCOPE));
engine.eval("function withProxy(){return proxy(m);}", engine.getBindings(ScriptContext.ENGINE_SCOPE));
(Wo m
ist eine JS-Funktion im Motorgültigkeitsbereich deklariert)
withoutProxy
aufrufen funktioniert gut. Aber withProxy
wirft
java.lang.ClassCastException: Cannot cast jdk.nashorn.api.scripting.ScriptObjectMirror to java.util.function.Function
at java.lang.invoke.MethodHandleImpl.newClassCastException(MethodHandleImpl.java:361)
at java.lang.invoke.MethodHandleImpl.castReference(MethodHandleImpl.java:356)
at jdk.nashorn.internal.scripts.Script$Recompilation$7$17A$\^eval\_.proxy(<eval>:1)
at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:639)
at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494)
at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393)
at jdk.nashorn.api.scripting.ScriptObjectMirror.call(ScriptObjectMirror.java:117)
at jdk.nashorn.internal.scripts.Script$Recompilation$6$20$\^eval\_.withProxy(<eval>:1)
at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:637)
at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494)
at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393)
at jdk.nashorn.api.scripting.ScriptObjectMirror.callMember(ScriptObjectMirror.java:199)
at jdk.nashorn.api.scripting.NashornScriptEngine.invokeImpl(NashornScriptEngine.java:383)
at jdk.nashorn.api.scripting.NashornScriptEngine.invokeFunction(NashornScriptEngine.java:190)
(die Stacktrace ist bei der Verwendung von 1.8.0_102-ea Gleiche Ausnahme mit jdk1.8.0_05 und jdk1.8.0_73..)
Also: Habe ich etwas falsch, ist es beabsichtigt oder ein Fehler?
heruntergeladen werden kann Ich habe keinen Fehler mit JDK 1.8.0_51. Dies könnte ein behobener Fehler gewesen sein? – Tunaki
Im Orakel/Java-Bugtracker steht, dass etwas Ähnliches (nur Ändern von Bindungen) nach 8u40 (also 8u60 und darüber) behoben wurde. Aber afaik 1.8.0_102-ea ist nie als 1.8.0_51. – MisterErwin
Ich habe es auch auf einer anderen Maschine getestet. (Ubuntu mit Java 1.8.0_91). Derselbe Fehler. (Um sicher zu sein, dass es jetzt eine Art Fehlkonfiguration verursacht) – MisterErwin