简体   繁体   中英

Bind a java class as a closure into a groovy-script

Is it possible to bind a closure written in java into a groovy-script. Is there an interface or something to implement so i can provide a closure?

Something like this?

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

Bind this into the groovyscript.

Binding binding = new Binding();
binding.put("example", new Example());
groovyScriptEngine.run("foo.groovy", binding)

and use it in the foo.groovy like this:

example("Hello World")

Done a bit of messing around and came up with this:

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 ;
  }
}

foo.groovy:

example( 'Hello World' )

and 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 )

Then, I compile the java code:

javac -cp ~/Applications/groovy/lib/groovy-1.7.1.jar Example.java

Run the Groovy code:

groovy -cp . test.groovy

And get the output:

EX: Hello World

edit

The groovy.lang.Closure class defines 3 variants of call:

Object call()
Object call(Object arguments)
Object call(Object[] args) 

I override the second one, but depending on your use-case, you might need any or all of the others

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM