5

大規模な Java アプリケーションに groovy を埋め込もうとしています。

Java アプリケーションは、起動時にいくつかのユーティリティ Groovy スクリプトをロードする必要があります。

その後、アプリケーションは他のスクリプトを複数回実行する必要があります。また、GUI でコードを入力し、ユーザーの要求に応じて実行する必要もあります。

私が直面している問題はこれです:

次のように起動スクリプトをロードしています。

GroovyShell gShell = new GroovyShell();
gShell.evaluate(new FileReader("scripts/autoload.groovy"));

autoload.groovy に以下が含まれているとします。

def prnt(m) {
    println("From Groovy: " + m);
}

これはうまくいきます。しかし、次を使用してユーザーコマンドを実行したい場合:

gShell.evaluate("prnt 66");

エラーが発生します: groovy.lang.MissingMethodException: No signature of method: Script2.prnt() is applicable for argument types: (java.lang.Integer) values: [66]

ユーザー スクリプトは、既に読み込まれているメソッドにどのようにアクセスできますか?

注:「autoload.prnt 88」も試しましたが、それでもエラーが発生します。

4

1 に答える 1

4

evaluate呼び出しはコンパイルされ、個別Scriptに実行されます。

def prnt(m) {
    println("From Groovy: " + m);
}

から生成されたScriptクラスのメソッドを定義しますautoload.groovy。これは、後続の「呼び出し」スクリプトからはアクセスできません。ただし、同じスクリプトで実行されるスクリプトは同じバインディングGroovyShellを共有するため、あるスクリプトからバインディングに値を格納し、別のスクリプトでそれらにアクセスできます。バインディングに値を格納することは、他の方法では宣言されていない変数に値を割り当てる場合にすぎません。

prnt = { m ->
    println("From Groovy: " + m);
}

これにより、バインディング変数prntにクロージャが格納され、同じシェル内の他のスクリプトからクロージャを呼び出すことができます。ご了承ください

def prnt = { m ->

また

Closure prnt = { m ->

またはタイプは、バインディングへの割り当てではなく、ローカル変数宣言(この特定のスクリプト専用)になるため、機能しません。def

于 2012-07-23T10:37:35.417 に答える