2010-03-30 26 views
3

是否可以將用java編寫的閉包綁定到groovy腳本中。是否有一個接口或實現的東西,所以我可以提供一個閉包?將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") 

回答

8

完成亂搞的位以及與此想出了:

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) 

我重寫第二個,但根據您的使用情況,您可能需要的任何或所有其他

+0

謝謝你,這是非常有益的。請注意,您也可以在Closure實現中清空擁有者腳本,以便您可以將其與Java綁定。 – codevour 2010-03-30 14:59:54

+0

也可以將外部Groovy閉包綁定到Groovy腳本中? – codevour 2010-03-30 15:04:35

+0

你的意思是將腳本綁定到腳本中? – 2010-03-30 15:19:59