「Groovyによる動的クラスロード」

 GroovyかわいいよGroovy。
 ええ、もう最近の自分のお気に入りです。Groovyによって動的言語の素晴しさを噛み締めております。動的言語が人気出る理由がよく分かりました。

 せっかくの動的言語ですし、動的クラスロードについて簡単にまとめてみました。

必要なもの

サンプルソース

def gcl = new GroovyClassLoader()

def clazz1 = gcl.parseClass(new File("Sample1.groovy")).newInstance()
def clazz2 = gcl.loadClass("Sample2").newInstance()
def clazz3 = new Sample3()

println clazz1.hoge()
println clazz2.hoge()
println clazz3.hoge()

printHoge(clazz1)
printHoge(clazz2)
printHoge(clazz3)

def printHoge(clazz) {
  println "printHoge: " + clazz.hoge()
}

class Sample2 {
  def hoge() {
    return this.class.getName()
  }
}

class Sample3 {
  def hoge() {
    return this.class.getName()
  }
}

Sample1.groovyの中身は以下のようになっています。

class Sample1 {
  def hoge() {
    return this.class.getName()
  }
}

実行結果

Windowsによる実行結果ですが、Linuxでも同じ結果になるはず。(未確認)
DynamicClassLoader.groovyはメインのスクリプトの名前です。実際にはa.groovyでもb.groobyでも何でも良いです。

C:\temp>groovy DynamicClassLoader.groovy
Sample1
Sample2
Sample3
printHoge: Sample1
printHoge: Sample2
printHoge: Sample3

感想

 このサンプルの肝は以下です。

  1. Sample1.groovyというファイルをロードして、直接オブジェクトを生成している
  2. クラス名からオブジェクトを生成している
  3. メソッド名が同じであれば、クラスの継承や、インタフェースの実装など行う必要なく処理を呼び出せる

 おそらく同じことはJavaでも出来ます。ですが、ここまで簡単に書けることは無いはずです。(書いたこと無いけど多分)
 余計な処理や、余計な継承など必要ないので非常にソースが見やすくスッキリしています。
 
 では、これが出来ると何がうれしいのか?
 これによって、処理を動的に切り替えることが、簡単に出来ます。例えば、スクリプトの引数に実行したいスクリプトのファイル名を渡して処理を実行するなど。Javaと違ってコンパイルなどは必要ありません。スクリプトファイルを作成して同じディレクトリにおいて、実行すればOK。
 というわけでGroovyかわいいよGroovy。Groovyはもっと評価されても良い。