Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Call anonymous JavaScript function

My curent JavaScript looks like this:

o.timer(function (){
    //Call from Java
    print("Hello World");
}).start(1000);

On the Java side receive a jdk.nashorn.internal.runtime.ScriptFunction witch I tried to call with

ScriptFunction callback = ...
callback.getBoundInvokeHandle(MethodType.methodType(Object.class)).invoke();

But it throws this:

java.lang.IllegalStateException: no current global instance
at jdk.nashorn.internal.objects.Global.instance(Global.java:474)
at jdk.nashorn.internal.objects.ScriptFunctionImpl.<init>(ScriptFunctionImpl.java:145)
at jdk.nashorn.internal.scripts.Script$\^eval\_._L3(<eval>:6)
at demo.Mainr$1.run(Main.java:38)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)

How can I call this function?

like image 573
th3_cr0wl3r Avatar asked Jun 17 '14 15:06

th3_cr0wl3r


1 Answers

Don't pass functions between Nashorn and Java. Pass objects which implement functional interfaces.

I assume o.timer is implemented in Java. In that case, make its parameter a Runnable (the generic functional interface for a function which takes nothing and returns nothing). Nashorn will detect that Java expects a functional interface and will be able to automatically convert the function to an anonymous class which implements that interface, so you don't have to change anything at your Javascript code to make it do that.

In your Java code you can then execute the script function of that Runnable with .run(). The javascript code will then be executed in the script context in which it was created.

like image 87
Philipp Avatar answered Sep 29 '22 05:09

Philipp