JavaからGroovyスクリプトを呼び出す(interfaceを使って)

Groovy: A Dynamic OO Language for the JVMにあるコードなのだけど、自分でもちょこっと変えて動かしてみる。ちゃんと動くものをのっけとけばあとでコピペできて便利ということで。Interfaceを使わない呼び出しもできるようだけど、使ったほうが少しコードが簡単になるみたい。
(注)えっと、S2OpenAMFのサンプル(Calculator)がわかりやすかったのでほぼそのまんまを使わせてもらいました。
気づいたことは一点

  • interfaceを使う場合は実装する側(Groovyのスクリプト)はメソッドのシグネチャをちゃんとinterfaceにあわせなければいけない(省略してはいけない。)。
// Javaのinterface
package test;

public interface Calculator {
    
    int plus(int a, int b);

}
// Javaのinterfaceを実装したgroovyスクリプト
import test.*

class CalculatorImpl implements Calculator {
    
 /*次のように戻り値の型や引数の型を省略すると実行時に
 呼び出し側でAbstractMethodErrorが発生するので注意。
    plus(a, b) {
        a + b
    }
 */    
     
    int plus(int a, int b) {
        a + b
    }
}
// groovyスクリプトを呼び出すJavaプログラム
package test;
import java.io.*;
import groovy.lang.*;

public class Client {
    
    public static void main(String args[])  {
        try {
            ClassLoader parent = 
                Thread.currentThread().getContextClassLoader(); 
            
            GroovyClassLoader loader = 
                new GroovyClassLoader( parent ); 
            
            Class groovyClass = 
                loader.parseClass( new File(args[0])); 
            
            Calculator calc = (Calculator) groovyClass.newInstance(); 
            
            int answer = calc.plus(Integer.parseInt(args[1]), 
                                    Integer.parseInt(args[2])); 
            
            System.out.println(answer);
        
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

classpathを通してコンパイル&実行 
実行するにはgroovy-1.0-beta-5.jar、asm-util-1.4.1.jar、asm-1.4.1.jarの3つを使用

C:\work\groovy\java>javac -classpath C:\groovy\groovy-1.0-beta-5.jar test\*.java

C:\work\groovy\java>java -classpath .;C:\groovy\groovy-1.0-beta-5.jar;C:\groovy\lib\asm-util-1.4.1.jar;C:\groovy\lib\asm-1.4.1.jar test.Client CalculatorImpl.groovy 5 10
15

groovyスクリプト名と5と10の3つを引数で渡す。5+10の結果の15が表示される。