2

変数を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);

グルーヴィーなコード:

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

出力:

From Java: foo
FROM GROOVY: foo

私の質問: SRESULTGroovy で変更し、Java で値にアクセスしたいと考えています。

誰でも私を助けることができますか?

4

2 に答える 2

8

バインディングはスクリプトにのみ適用され、クラスには適用されません。Groovy コードがスクリプトの場合、つまりmain、周囲のクラス本体を含まないメソッドのコンテンツのみの場合

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

そうすれば、期待どおりの結果が得られます。特に、スクリプト内で変数を宣言してはなりません。つまり、SRESULT

def SRESULT = 'bar'

動作しません。これは、宣言 (defまたは明示的な型を使用) がスクリプト内でローカル変数を作成し、バインディングに割り当てないためです。

于 2013-02-26T14:42:56.330 に答える
3

含まれている場合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
于 2013-02-26T13:52:33.557 に答える