代码之家  ›  专栏  ›  技术社区  ›  Christopher Klewes

将Java类作为闭包绑定到Groovy脚本中

  •  4
  • Christopher Klewes  · 技术社区  · 14 年前

    是否可以将用Java编写的闭包绑定到Groovy脚本中。是否有一个接口或什么东西可以实现以便我可以提供一个闭包?

    像这样的?

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

    将其绑定到groovyscript中。

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

    把它用在 foo.groovy 这样地:

    example("Hello World")
    
    1 回复  |  直到 14 年前
        1
  •  9
  •   tim_yates    14 年前

    做了一点手脚然后想出了这个:

    爪哇

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

    GooVy:

    example( 'Hello World' )
    

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

    然后,我编译了Java代码:

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

    运行groovy代码:

    groovy -cp . test.groovy
    

    然后得到输出:

    EX: Hello World
    

    编辑

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

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

    我重写了第二个,但是根据您的用例,您可能需要任何或所有其他的