Hatena::ブログ(Diary)

on the center line.

2008-06-01

JavaからコンパイルされてないGroovyを呼び出す方法(クラス、メソッド)

| 01:28

前回に続き、JavaからGroovyスクリプを実行する方法。今回は通常のクラスの、インスタンスメソッドを実行する方法について紹介。

  GroovyClassLoader loader = new GroovyClassLoader(this.getClass().getClassLoader());
  Class cls = loader.parseClass(new File("....name.groovy"));

  // 以降は、通常のJavaクラスの呼び出しと同じようにリフレクションする

ルーズステートメントと違い、ただスクリプトを読み込んだだけでは、runメソッドは実行できないようです。そこで上記例のように、GroovyClassLoaderを使ってクラスを読み込みます。

前回の例と同じように、....name.groovy のところを該当のスクリプトファイル名に置換すれば動作するはずです。その他、オプションなど詳しいことは、Javadochttp://groovy.codehaus.org/api/index.html)で確認してください。

JavaからコンパイルされてないGroovyを呼び出す方法(ルーズステートメント)

| 01:19

JavaからGroovyスクリプトを実行する方法。やり方はいくつかあるのですが、その中から比較的シンプルなやりかたを紹介。

  new GroovyShell().parse(new File("....name.groovy")).run();

これだけです。....name.groovy のところを該当のスクリプトファイル名に置換すれば動作するはずです。詳しいことは、Javadochttp://groovy.codehaus.org/api/index.html)で確認してください。ちなみに、Groovy1.5 と、Groovy1.6 ではそこそこ変更されているようでした。

また、実行されるスクリプトの中身についてですが、ルーズステートメントと、クラス定義の両方がある場合に、エラーが発生することがあるようます。というのは、Foo.groovyの中のルーズステートメントは、実行時にFoo.Mainメソッド内の処理とみなされるためです。つまり、Foo.groovyスクリプト中に、Fooクラスの定義を書いている場合、Foo.Mainを実行するためにFooクラスが作成されるので、結果、クラスの定義が2つできてしまい、コンパイルエラーとなります。解決策としては、Foo.groovyのファイル名を変えるか、Fooクラスのクラス名を変えるかしかないと思います。。。

なお、実行に必要なライブラリですが、

僕がためしたサンプルはこれだけあれば実行できました。