CodeModelでJavaのソースコードを生成する

この頃はgradleでAndroidのビルドを行うようになり、それに伴いJavaソースコードをビルド時に生成する機会も増えてきたと思います。

それでは、Javaソースコードはどうやって生成するのがいいでしょうか。文字列結合も悪くないのですが、文法の妥当性を保証したりインデントを正しく行ったりするのは大変めんどうくさいものです。それならば、Javaソースコードを生成するライブラリを使いましょう!幸い、gradleがあればJavaのライブラリを使うのは簡単ですし、build.gradleにちょっとコードを書いて試すのもスクリプト言語のような感覚でできます。

例:以下をgradleコマンドで起動すると、java/com/example/cm/Foo.java にクラスを生成します。

https://github.com/gfx/java-codemodel-example

// build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.sun.codemodel:codemodel:2.6'
    }
}

import com.sun.codemodel.*

def cm = new JCodeModel()

def klass = cm._class("com.example.cm.Foo")

klass.field(JMod.PUBLIC, int.class, "intVal")
klass.field(JMod.PUBLIC, cm.ref(Map.class).narrow(String.class, String.class), "mapVal")
klass.field(JMod.PUBLIC, cm.ref(List.class).narrow(String.class), "arrayVal")


file("java").mkdir()
cm.build(file("java"))

生成したクラスは以下のようになります。

package com.example.cm;

import java.util.List;
import java.util.Map;

public class Foo {

    public int intVal;
    public Map<String, String> mapVal;
    public List<String> arrayVal;

}

正しいJavaソースコードを、必要なクラスはimportして、適切にインデントをしたうえで生成します。簡単ですね。

Enjoy Hacking!