5

Java での Groovy の使用に関して 3 つの質問があります。それらはすべて関連しているため、ここでは 1 つの質問のみを作成します。

1) GroovyClassLoader、GroovyShell、GroovyScriptEngine があります。しかし、それらを使用することの違いは何ですか?

たとえば、このコードの場合:

static void runWithGroovyShell() throws Exception {
    new GroovyShell().parse(new File("test.groovy")).invokeMethod("hello_world", null);
}

static void runWithGroovyClassLoader() throws Exception {
    Class scriptClass = new GroovyClassLoader().parseClass(new File("test.groovy"));
    Object scriptInstance = scriptClass.newInstance();
    scriptClass.getDeclaredMethod("hello_world", new Class[]{}).invoke(scriptInstance, new Object[]{});
}

static void runWithGroovyScriptEngine() throws Exception {
    Class scriptClass = new GroovyScriptEngine(".").loadScriptByName("test.groovy");
    Object scriptInstance = scriptClass.newInstance();
    scriptClass.getDeclaredMethod("hello_world", new Class[]{}).invoke(scriptInstance, new Object[]{});
}

2) Groovy スクリプトをロードして、コンパイルされた形式でメモリに保持し、必要なときにそのスクリプトで関数を呼び出すことができる最良の方法は何ですか。

3) Java メソッド/クラスを Groovy スクリプトに公開して、必要なときに呼び出せるようにするにはどうすればよいですか?

4

1 に答える 1

2

メソッド2と3はどちらも、解析されたものclassを返します。したがって、map解析されて正常にロードされたら、を使用してメモリに保持できます。

Class scriptClass = new GroovyClassLoader().parseClass(new File("test.groovy"));
map.put("test.groovy",scriptClass);

アップデート:

GroovyObjectは、groovyオブジェクトのドキュメントにリンクしています。

また、GroovyObjectと他のJavaクラスは区別がつかないため、オブジェクトを直接キャストすることもできます。

Object aScript = clazz.newInstance();
MyInterface myObject = (MyInterface) aScript;
myObject.interfaceMethod();
 //now here you can also cache the object if you want to

効率についてコメントすることはできません。ただし、ロードされたクラスをメモリに保持しておけば、1回の解析でそれほど問題はないと思います。

更新効率のために:を使用する必要があります。これは内部でスクリプトキャッシュGroovyScriptEngineを使用します。

リンクは次のとおりです:Groovyスクリプトエンジン

それ以外の場合は、パフォーマンスベンチマークを使用していつでもテストでき、大まかなアイデアが得られます。例:3つの異なるループで3つのメソッドすべてを使用してGroovyスクリプトをコンパイルし、どちらがパフォーマンスが優れているかを確認します。同じスクリプトと異なるスクリプトを使用して、何らかの方法でキャッシュが機能するかどうかを確認してください。

スクリプトとの間でパラメータを渡すための更新 バインディングクラスは、スクリプトとの間でパラメータを送信するのに役立ちます。

リンク例

// setup binding
def binding = new Binding()
binding.a = 1
binding.setVariable('b', 2)
binding.c = 3
println binding.variables

// setup to capture standard out
def content = new StringWriter()
binding.out = new PrintWriter(content)

// evaluate the script
def ret = new GroovyShell(binding).evaluate('''
def c = 9
println 'a='+a
println 'b='+b
println 'c='+c 
retVal = a+b+c
a=3
b=2
c=1
''')

// validate the values
assert binding.a == 3
assert binding.getVariable('b') == 2
assert binding.c == 3 // binding does NOT apply to def'd variable
assert binding.retVal == 12 // local def of c applied NOT the binding!

println 'retVal='+binding.retVal
println binding.variables
println content.toString()
于 2012-12-07T16:59:24.180 に答える