【问题标题】:Bind a java class as a closure into a groovy-script将 java 类作为闭包绑定到 groovy 脚本中
【发布时间】:2010-03-30 06:58:52
【问题描述】:

是否可以将用 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")

【问题讨论】:

    标签: java binding groovy closures


    【解决方案1】:

    做了一些乱七八糟的事情并想出了这个:

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

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

    我会覆盖第二个,但根据您的用例,您可能需要任何或所有其他

    【讨论】:

    • 谢谢,这很有帮助。注意,你也可以在闭包实现中为所有者脚本为空,这样你就可以从 Java 中绑定它。
    • 是否也可以将外部 Groovy 闭包绑定到 Groovy 脚本中?
    • 你的意思是把脚本绑定到脚本中?
    • 优秀。那行“GroovyScriptEngine gse = new GroovyScriptEngine(['.'] as String[])”非常漂亮。谢谢。
    猜你喜欢
    • 2023-03-13
    • 2011-03-15
    • 2015-06-25
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    相关资源
    最近更新 更多