top / index / prev / next / target / source

2005-08-17 diary: Java: blancoIgを用いたJavaソースコード生成シンプルサンプル

いがぴょんの日記 日記形式でつづる いがぴょんコラム ウェブページです。

old-v2

Java: blancoIgを用いたJavaソースコード生成シンプルサンプル

blanco Frameworkの根っこのライブラリである blancoIgを用いた Javaソースコード自動生成のシンプルサンプルを作成しました。

blancoIgを用いた Javaソースコード生成シンプルサンプル

blancoIgを用いた Javaソースコード生成シンプルサンプルを作りました。

依存するライブラリ

import blanco.ig.expander.ClassExpander; import blanco.ig.expander.Type; import blanco.ig.expander.Value; import blanco.ig.expander.field.PrivateField; import blanco.ig.expander.method.MethodExpander; import blanco.ig.generator.GeneratorSetting; import blanco.ig.generator.ImplementGenerator; import blanco.ig.service.ServiceClass;

/** * すごく単純な blancoIgの利用サンプルです。 * * @author Tosiki Iga */ public class BlancoIgSimpleGenerator {

public static void main(String[] args) {
    // パッケージ名やクラス名を指定します。
    ClassExpander classExpander = new ClassExpander(new Type("my.pkg",
            "MyClass")) {
        protected void expandClassStruct() {
            addFileComment("はじめての blancoIg動作サンプル<br>");
            addFileComment("このサンプルは機械的に生成されました。");
            getJavaDoc().addLine("はじめてのクラスのサンプル<br>");
            getJavaDoc().addLine("このサンプルはblancoIgにより機械的に自動生成されています。");
            getJavaDoc().addLine("");
            getJavaDoc().addLine("@version 2005.08.16");
            getJavaDoc().addLine("@author Tosiki Iga");

            // フィールド変数を宣言します。
            PrivateField field1 = new PrivateField(new Type(
                    "java.sql.Connection"), "Connection");
            field1.getJavaDoc().addLine("フィールド変数の例となります。<br>");
            field1.getJavaDoc().addLine("ただしこのサンプルでは利用されていませんね…");
            addField(field1);

            addMethod(new MethodExpander("myMethod") {
                // メソッドのシグニチャ指定
                public void setupSignature() {
                    getJavaDoc().addLine("はじめてのメソッド");
                    getJavaDoc().addParameter("argInt", "単なる引数です");
                    addArgument(new Value(int.class, "argInt"));
                    getJavaDoc().addParameter("argString", "単なる引数2です");
                    addArgument(new Value(String.class, "argString"));
                    getJavaDoc().addParameter("argString", "文字列渡しによる引数3です");
                    addArgument(new Value(new Type("java.lang.String"),
                            "argString3"));
                    getJavaDoc().addReturn("このメソッドの実行結果です");
                    setReturnType(new Type(int.class));
                    getJavaDoc().addException(
                            new Type("java.sql.SQLException"), "データベース例外");
                    addException(new Type("java.sql.SQLException"));
                }

                // メソッドの実装
                public void implement() {
                    String escapedQuery = "はろう\"わーるど\"".replaceAll("\"",
                            "\\\\\"");
                    getData().addLine(
                            "System.out.println(\"" + escapedQuery
                                    + "\" + argString);");

                    getData().addLine("return argInt;");
                }
            });

            addMethod(new MethodExpander("main") {
                protected boolean isStatic() {
                    return true;
                }

                // メソッドのシグニチャ指定
                public void setupSignature() {
                    setFinal(true);
                    getJavaDoc().addLine("はじめてのクラスのメインメソッド");
                    getJavaDoc().addLine("メインメソッドは このように実装されます。");
                    getJavaDoc().addParameter("args", "メインメソッドへの引数。");
                    addArgument(new Value(new Type("java.lang.String[]"),
                            "args"));
                }

                // メソッドの実装
                public void implement() {
                    getData().addLine("try {");
                    getData().addLine(
                            "new MyClass().myMethod(1, \"引数の値\", \"3\");");
                    getData().addLine("} catch(SQLException ex) {");
                    getData().addLine("ex.printStackTrace();");
                    getData().addLine("}");
                }
            });
        }
    };

    // 実際にJavaソースコードを生成します。
    GeneratorSetting setting = new GeneratorSetting();
    // 出力先ディレクトリを設定します。
    setting.setWorkDirectory("blanco");
    ImplementGenerator implementGenerator = new ImplementGenerator(
            new ServiceClass("DummyService"), setting);
    // 作成したクラスを登録します。
    implementGenerator.addMain(classExpander);
    try {
        // 実際にソースコード生成を実行します。
        implementGenerator.generate();
        System.out.println("ソースコード生成が完了しました。");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

} ```

サンプルを動作させてみて、実際にJavaソースコードが生成されるのは、ふだん blancoDbなどで動作は知っているとはいえ、とても印象的でした。

blancoIgを利用するソースコードを、私は初めてスクラッチから作成しました。フラットに記述したら結構シンプルに記述できることを知り、嬉しかったです。

書籍やひげ剃りの購入

世間のニュースから


この日記について