プログラマメモ2 - programmer no memo2

groovyをプログラムの中から使用するひとつの例 2006/10/27
2006/11/25

JDK6からスクリプトが普通にJavaでサポートされます。

非常にたのしみです。長年親しんだJavaからいろいな言語との連携がしやすくなると思うと、いろいろ妄想が拡がっていきますね。



groovyをプログラムの中から使用するひとつの例です。





シナリオ:プログラムロジックを外にだす(スクリプト)して実行したい。





まず、Javaから呼び出し方法をインターフェイスにします。

オブジェクトを配列で受け取るようにしています。



public interface IProcess {

public Object process(Object ...objects);

}





次に、Groovyを処理しやすいようにユーティリティークラスを作成します。ファイル名が指定されるとそれを読み込んでインスタンス化して利用するために使用します。



import java.io.File;

import java.io.IOException;

import java.io.UnsupportedEncodingException;

import java.net.URL;

import java.net.URLDecoder;



import org.codehaus.groovy.control.CompilationFailedException;



import groovy.lang.GroovyClassLoader;



public abstract class GroovyUtils {



public static Object getGroovyScript(String groovyFile)

throws InstantiationException, IllegalAccessException,

CompilationFailedException, ClassNotFoundException, IOException {



GroovyClassLoader gcl = new GroovyClassLoader(Thread.currentThread()

.getContextClassLoader());

Class clazz = gcl.parseClass(getResourceFile(gcl, groovyFile));

Object object = clazz.newInstance();

return object;

}



static public File getResourceFile(ClassLoader classLoader, String name)

throws UnsupportedEncodingException {

URL url = classLoader.getResource(name);

String filename = null;

File returnFile = null;



filename = url.getFile();

filename = URLDecoder.decode(filename, "UTF-8");

returnFile = new File(filename);



return returnFile;

}



}







次にGroovyスクリプトです。単純にもらったオブジェクトを足し算するというものです。

いかにもJavaっぽいコードですがgroovyスクリプトです。



public class Calc implements IProcess

{



public Object process(Object[] os){

return os[0] + os[1]

}



}





最後にテスト実行クラスです。

import java.io.IOException;



import org.codehaus.groovy.control.CompilationFailedException;



public class TestMainForGroovy {



public static void main(String[] args) throws InstantiationException,

IllegalAccessException, CompilationFailedException,

ClassNotFoundException, IOException {



new MyTest().doProcess();

}



static class MyTest {

public void doProcess() throws CompilationFailedException,

InstantiationException, IllegalAccessException,

ClassNotFoundException, IOException {



String result;

IProcess process = (IProcess) GroovyUtils

.getGroovyScript("calc.groovy");



result = "" + process.process("aaa", 1);



System.out.println(result);

}

}

}







テストクラスを実行をするとgroovyスクリプトが実行されます。





頻繁にロジックが変化する場合は便利かもしれませんね。





groovyにしろjavaプログラマは他の言語にもっと挑戦したほうがハッピーになれるのでしょう。

※僕は、Smalltalk勉強したいんですが成せていません。Orz

: