我尝试将变量绑定到Groovy,然后从Groovy绑定到Java:
Java代码:
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代码:
class Est {
static SRESULT
public static void main(String[] args) {
println 'From Java: '+SRESULT
SRESULT = 'bar'
}
}
输出:
From Java: foo
FROM GROOVY: foo
我的问题:我想在Groovy中更改SRESULT
并可以访问Java中的值。
有人能帮助我吗?
答案 0 :(得分:8)
绑定仅适用于脚本,而不适用于类。如果您的Groovy代码是一个脚本,即只有main
方法的内容而没有周围的类主体
println 'From Java: '+SRESULT
SRESULT = 'bar'
那么它会产生你期望的结果。特别是你不得在脚本中声明 SRESULT
变量,即
def SRESULT = 'bar'
将不工作。这是因为声明(使用def
或使用显式类型)在脚本中创建局部变量,它们不会分配给绑定。
答案 1 :(得分:2)
鉴于Test.java
包含:
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 ) ;
}
}
script.groovy
包含:
println "From Java: $SRESULT"
SRESULT = 'bar'
我们可以通过以下方式编译Test.java
:
javac -cp $GROOVY_HOME/embeddable/groovy-all-2.1.1.jar:. Test.java
然后运行:
java -cp $GROOVY_HOME/embeddable/groovy-all-2.1.1.jar:. Test
给出输出:
From Java: foo
FROM GROOVY: bar