arcanum_jp’s blog

おっさんの日記

Groovyの勉強 JavaからGroobyを呼び出す。

 Groovyのサイトからダウンロード。ダウンロードは以下のサイトから。このエントリを書いた時点では1.8.0が最新版だった。

前準備

Groovy 1.8.0 final
You can have a look at the JIRA release notes.

http://groovy.codehaus.org/Download

 圧縮ファイルを解凍するとlibフォルダがあり、そこにGroovy本体がある。これを作っているアプリとかのライブラリのフォルダに放り込みパスを通す。

groovy-1.8.0.jar

 あと、実行する際に必要な(と思われる)ライブラリも入れてあげる。これらは圧縮ファイルのlibフォルダにあった。

asm-3.2.jar
asm-analysis-3.2.jar
asm-commons-3.2.jar
asm-tree-3.2.jar
asm-util-3.2.jar
antlr-2.7.7.jar

実行してみる

Webアプリとかのボタンの処理でGroovyScriptEngineクラスを使用するコードを書いてみる。


とある、処理で・・・

// 第一引数はスクリプトファイルがあるフォルダ
GroovyScriptEngine gse = new GroovyScriptEngine("c:\\gs");
Binding bind = new Binding();
// 第一引数はスクリプトファイル名、第2引数は引数オブジェクト?
Object o = gse.run("abc.groovy", bind);
Logger.getLogger(getClass()).debug("o=" + o);


c:\\gs\\abc.groovy

println 'hello groovy'

実行結果

hello groovy

変数はどうやって引き渡すか

Bindingクラスを使う。このBinding#setVariable()の第一引数に引き渡した文字列が呼び出されたGroovyスクリプト内での変数名になる。

引き渡すクラス

class Hoge{
  ・・・
}
GroovyScriptEngine gse = new GroovyScriptEngine("c:\\gs");
Binding bind = new Binding();
bind.setVariable("varhoge", hoge);
bind.setVariable("varstr", "Stringの変数");
Object o = gse.run("abc.groovy", bind);
Logger.getLogger(getClass()).debug("o=" + o);


c:\\gs\\abc.groovy

println 'hello groovy'
println varhoge
println varstr

実行結果

hello groovy
Hoge@14c4b73
Stringの変数
2011-07-19 23:58:52,375 [DEBUG] o=null

戻り値はどうなの

Stringの戻り値を返してみる。

下は先ほどのabc.groovy

println 'hello groovy'
println varhoge
println varstr
return 'hello too!'

結果

hello groovy
Hoge@1d3db5c
Stringの変数
2011-07-20 00:05:54,319 [DEBUG] o=hello too!
オブジェクトを返してみる

下は先ほどのabc.groovy

println 'hello groovy'
println varhoge
println varstr
return varhoge
hello groovy
Hoge@1d3db5c
Stringの変数
2011-07-20 00:05:54,319 [DEBUG] o=Hoge@1d3db5c

なるほど、引数で渡したオブジェクト自身が返ってきた。(考えれば当たり前だけど)

Java側で書いていたDBへの接続処理はどうなるのか

 今回、Javaに書いていたものをGroovy化する目的があったんだけど、今まで書いていたDb接続処理とかはスクリプトに貼り付けて動くのだろうか?今動いているコードを貼り付けて実験


abc.groovy

import java.sql.Connection;
import jp.僕のパッケージ.DBUtil;
import jp.僕のパッケージ.dao.SelectInformationTbl;

con = DBUtil.getConnection()   // java.sql.Connectionを取得する処理
SelectInformationTbl sql = new SelectInformationTbl();
List sqllist = sql.exec(con)   // SQLを発行するメソッドとか・・・

println sqllist.get(0).getId()

 一応、動いた。

 なるほど、JavaからGroovyまたJavaへの処理は結構簡単