Embedding Groovy in Java (Binding)

2020-03-07 06:26发布

问题:

I try to Bind Variables to Groovy and from Groovy back zu Java:

Java code:

Binding binding = new Binding();
binding.setVariable("SRESULT", "foo");
GroovyShell gs = new GroovyShell(binding);
gs.evaluate(script);
String sResult = (String) gs.getContext().getVariable("SRESULT");
System.out.println("FROM GROOVY: " + sResult);

Groovy Code:

class Est {  
  static SRESULT
  public static void main(String[] args) {
    println 'From Java: '+SRESULT
    SRESULT = 'bar'
  }
}

Output:

From Java: foo
FROM GROOVY: foo

My Question: I want to change SRESULT in Groovy and have access to the Value in Java.

Can anybody help me?

回答1:

The binding only applies to scripts, not to classes. If your Groovy code were a script, i.e. just the content of the main method without the surrounding class body

println 'From Java: '+SRESULT
SRESULT = 'bar'

then it would produce the result you expect. In particular you must not declare the SRESULT variable in the script, i.e.

def SRESULT = 'bar'

would not work. This is because the declarations (with def or with an explicit type) create local variables within the script, they do not assign to the binding.



回答2:

Given Test.java containing:

import groovy.lang.Binding ;
import groovy.lang.GroovyShell ;
import java.io.File ;

public class Test {
    public static void main( String[] args ) throws Exception {
        Binding binding = new Binding() ;
        binding.setVariable( "SRESULT", "foo" ) ;

        GroovyShell gs = new GroovyShell( binding ) ;
        gs.evaluate( new File( "script.groovy" ) ) ;

        String sResult = (String)binding.getVariable( "SRESULT" ) ;
        System.out.printf( "FROM GROOVY: %s\n", sResult ) ;
    }
}

And script.groovy containing:

println "From Java: $SRESULT"
SRESULT = 'bar'

We can compile Test.java by doing:

javac -cp $GROOVY_HOME/embeddable/groovy-all-2.1.1.jar:. Test.java

And then running it with:

java -cp $GROOVY_HOME/embeddable/groovy-all-2.1.1.jar:. Test

Gives the output:

From Java: foo
FROM GROOVY: bar