将java类作为闭包绑定到groovy脚本中

Chr*_*wes 4 java groovy binding closures

是否可以将用java编写的闭包绑定到groovy脚本中.是否有接口或要实现的东西,所以我可以提供一个闭包?

像这样的东西?

public class Example implements Closure {
   public void closure(Object... args) {
       System.out.println(args[0]);
   }
}
Run Code Online (Sandbox Code Playgroud)

把它绑在groovyscript中.

Binding binding = new Binding();
binding.put("example", new Example());
groovyScriptEngine.run("foo.groovy", binding)
Run Code Online (Sandbox Code Playgroud)

并在foo.groovy这样使用它:

example("Hello World")
Run Code Online (Sandbox Code Playgroud)

tim*_*tes 9

做了一点搞乱,想出了这个:

Example.java

import groovy.lang.Closure ;

public class Example extends Closure {
  public Example( Object owner, Object thisObject ) {
    super( owner, thisObject ) ;
  }

  public Example( Object owner ) {
    super( owner ) ;
  }

  public Object call( Object params ) {
    System.out.println( "EX: " + params ) ;
    return params ;
  }
}
Run Code Online (Sandbox Code Playgroud)

foo.groovy:

example( 'Hello World' )
Run Code Online (Sandbox Code Playgroud)

和test.groovy:

import groovy.lang.Binding
import groovy.util.GroovyScriptEngine

Binding binding = new Binding()
binding.example = new Example( this )
GroovyScriptEngine gse = new GroovyScriptEngine( [ '.' ] as String[] )
gse.run( "foo.groovy", binding )
Run Code Online (Sandbox Code Playgroud)

然后,我编译java代码:

javac -cp ~/Applications/groovy/lib/groovy-1.7.1.jar Example.java
Run Code Online (Sandbox Code Playgroud)

运行Groovy代码:

groovy -cp . test.groovy
Run Code Online (Sandbox Code Playgroud)

得到输出:

EX: Hello World
Run Code Online (Sandbox Code Playgroud)

编辑

groovy.lang.Closure类定义调用的3个变种:

Object call()
Object call(Object arguments)
Object call(Object[] args) 
Run Code Online (Sandbox Code Playgroud)

我覆盖了第二个,但根据您的用例,您可能需要其他任何一个或全部