or1ko's diary

日々を書きます

クラス名とメソッド名を出力するカスタムDoclet

クラス名やそのメソッド一覧が取得したくてJavadocのカスタムDocletを思い出して、使ってみたが、以外と目的にたどり着けなかったため、記録を残す。

JDK 9 からカスタムDocletの作成方法が変更されたようだ。
Using the new Doclet API

SampleDoclet.java
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Set;

import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.tools.Diagnostic.Kind;

import jdk.javadoc.doclet.Doclet;
import jdk.javadoc.doclet.DocletEnvironment;
import jdk.javadoc.doclet.Reporter;

public class SampleDoclet implements Doclet {
  private Reporter rep;

  @Override
  public void init(Locale locale, Reporter reporter) {
    this.rep = reporter;
  }

  @Override
  public String getName() {
    // Docletの名前
    return "sampleDoclet";
  }

  @Override
  public Set<? extends Option> getSupportedOptions() {
    // このDoclet用の引数を定義する
    return Collections.emptySet();
  }

  @Override
  public SourceVersion getSupportedSourceVersion() {
    // サポートするソースコードのバージョン
    return SourceVersion.latest();
  }

  @Override
  public boolean run(DocletEnvironment docEnv) {

    Set<? extends Element> includedElements = docEnv.getIncludedElements();
    for (Element element : includedElements) {
      if (element.getKind() == ElementKind.CLASS) {
        rep.print(Kind.NOTE, "クラス名 -> " + element.getSimpleName().toString());
        List<? extends Element> members = element.getEnclosedElements();
        for (Element member : members) {
          if (member.getKind() == ElementKind.METHOD) {
            rep.print(Kind.NOTE, "メソッド名 -> " + member.toString());
          }
        }
      }
    }
    return true;
  }
}
実行結果
> javac SampleDoclet.java -encoding utf8
> javadoc SampleDoclet.java -sourcepath . -doclet SampleDoclet -docletpath . -encoding utf-8
ソース・ファイルSampleDoclet.javaを読み込んでいます...
Javadoc情報を構築しています...
クラス名 -> SampleDoclet
メソッド名 -> init(java.util.Locale,jdk.javadoc.doclet.Reporter)
メソッド名 -> getName()
メソッド名 -> getSupportedOptions()
メソッド名 -> getSupportedSourceVersion()
メソッド名 -> run(jdk.javadoc.doclet.DocletEnvironment)