Java/Nashorn将一个函数放在绑定/全局范围内

Sch*_*tod 2 java scope nashorn

我有一个静态方法,如:

some abstract class C {
    void dump( Object o ) {
}
Run Code Online (Sandbox Code Playgroud)

我想传递给js,我可以直接在全球范围内使用它,如:

js> dump( new Something() );
Run Code Online (Sandbox Code Playgroud)

到目前为止,我发现的唯一方法是创建一个像

public class CStub {
    void dump( Object o ){ C.dump( o ); }
}
Run Code Online (Sandbox Code Playgroud)

把它放在nashorn通过:

engine.put( "stub", new CStub() );
Run Code Online (Sandbox Code Playgroud)

然后在js中:

js> var dump = stub.dump
Run Code Online (Sandbox Code Playgroud)

但是还有另一种方法,它不涉及存根创建并将方法直接放在全局范围内?

A. *_*jan 8

您可以在类中实现类似java.util.function.Function 的功能接口(https://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html)并公开它的对象作为nashorn的全局变量.Nashorn将任何"功能接口"对象视为一个函数,并允许直接调用它.公开"转储"功能的简单示例如下:

import javax.script.*;
import java.util.function.Function;

public class Main {
   // a Function implementation
   private static class MyFunc implements Function<String, Void> {
       @Override
       public Void apply(String msg) {
           System.out.println(msg);
           return null;
       }
   }

   public static void main(String[] args) throws Exception {
       ScriptEngineManager m = new ScriptEngineManager();
       ScriptEngine e = m.getEngineByName("nashorn");

       // expose functional interface object as a global var
       e.put("dump", new MyFunc());

       // invoke functional interface object like a function!
       e.eval("dump('hello')");
   }
}
Run Code Online (Sandbox Code Playgroud)