かずきのBlog

C#やJavaやRubyとメモ書き

目次

Blog 利用状況

ニュース

わんくまBlogが不安定になったため、前に書いてたはてなダイアリーにメインを移動します。
かずきのBlog@Hatena
技術的なネタは、こちらにも、はてなへのリンクという形で掲載しますが、雑多ネタははてなダイアリーだけに掲載することが多いと思います。
コメント
プログラマ的自己紹介
お気に入りのツール/IDE
プロフィール
経歴
アクセサリ

書庫

日記カテゴリ

[NetBeans][Java]Alt + Insertで出るコードジェネレーションをカスタマイズ

NetBeans6系で気に入ってる機能の1つ!Alt + Insertでコードを色々生成出来るってのがある。
エディタ上でAlt + Insert(若干押しにくい)を押すと下のようなものが出てくる
image

ここから生成したいコードを選ぶと、さくっとコードが出力される。
例えば、equals() and hashCode()...を選ぶと
image

どのフィールドを対象にするかを選択するダイアログが出てきて
image

こんな感じのコードが出力される

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Employees other = (Employees) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        if (this.name != other.name && (this.name == null || !this.name.equals(other.name))) {
            return false;
        }
        if (this.entDate != other.entDate && (this.entDate == null || !this.entDate.equals(other.entDate))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 19 * hash + (this.id != null ? this.id.hashCode() : 0);
        hash = 19 * hash + (this.name != null ? this.name.hashCode() : 0);
        hash = 19 * hash + (this.entDate != null ? this.entDate.hashCode() : 0);
        return hash;
    }

これをカスタマイズしてみようと思う。

 

プロジェクト作成

まず、モジュールのプロジェクトを作成する。名前は何でもいいけど、とりあえずinsertという名前にした。
パッケージはcom.wankuma.kazuki.insertにしておいた。layer.xmlを使うので生成するようにしておく。

そして、ライブラリに以下の3つを追加する。Java Editorのほうは、公式に公開されてるものじゃないみたいなので、Non-API Modulesからみつけるようにする。

  1. Javac API Wrapper
  2. Java Editor(Show Non-API Modulesにチェックを入れないと出てこない)
  3. Java Source

そして、ここでもう一手間。
これから使うクラスは、まだ公開されてないということなので、無理やり使うように設定する。
Java Editorで右クリックしてEdit...を選択する。

出てきたダイアログで、Specification VersionからImplementation Versionに変更する。
image

 

Let's プログラミング!

そしたらおもむろにクラスを作成する。名前はcom.wankuma.kazuki.insert.HelloCodeGeneratorにする。
そしてorg.netbeans.modules.java.editor.codegen.CodeGeneratorをimplementsする。

package com.wankuma.kazuki.insert;

import javax.swing.text.JTextComponent;
import org.netbeans.modules.java.editor.codegen.CodeGenerator;

public class HelloCodeGenerator implements CodeGenerator {

    public String getDisplayName() {
        return null;
    }

    public void invoke(JTextComponent textComponent) {
    }

}

getDisplayNameはAlt + Insertのときに表示されるテキスト。invokeは、実際の挿入処理を行うみたい。
さくっと実装してみた。

    public String getDisplayName() {
        return "Hello world";
    }

    public void invoke(JTextComponent textComponent) {
        // キャレットの位置を取得して
        int mark = textComponent.getCaret().getMark();
        try {
            // そこに適当な文字列を挿入する
            textComponent.getDocument().insertString(
                    mark, "System.out.println(\"Hello world\");", null);
        } catch (BadLocationException ex) {
            Logger.getLogger(HelloCodeGenerator.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

そして、Generatorを生成するためのファクトリクラスを作成する。
とりあえずHelloCodeGeneratorの内部クラスにする。

public class HelloCodeGenerator implements CodeGenerator {

    // ファクトリクラス!
    public static class Factory implements CodeGenerator.Factory {
        // Iterableを返すらしいので、さくっとね
        public Iterable<? extends CodeGenerator> create(CompilationController arg0, TreePath arg1) throws IOException {
            return Collections.singleton(new HelloCodeGenerator());
        }
        
    }
    
    public String getDisplayName() {
    // 以下略

}

後は、ファクトリクラスを、layer.xmlのEditors/text/x-java/codegeneratorsに登録する。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
<filesystem>
    <folder name="Editors">
        <folder name="text">
            <folder name="x-java">
                <folder name="codegenerators">
                    <file name="com-wankuma-kazuki-insert-HelloCodeGenerator$Factory.instance" />
                </folder>
            </folder>
        </folder>
    </folder>
</filesystem>

これで完成!!

 

実行してみよう

F6を押して実行!テスト用NetBeansが立ち上がる。

適当にJavaのプロジェクトを作成してJavaのコードエディタ内でAlt + Insertをしてみると....
image

出た!!選択すると…
image

お~出た~。
こんな手軽にいけるなら、がんがん俺様フレームワークのスニペットみたいなのを作れるんじゃないだろうか。
単純に固定区を入れるものから、設定ファイルからコード生成するものとか…

夢は広がる。

投稿日時 : 2008年5月14日 23:13

Feedback

# [NetBeans][Java]コードジェネレータを作ってみよう(NB5.5) 2008/09/13 22:00 かずきのBlog

[NetBeans][Java]コードジェネレータを作ってみよう(NB5.5)

タイトル  
名前  
Url
コメント