问题
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
来源:https://stackoverflow.com/questions/15089593/embedding-groovy-in-java-binding