クラス名とメソッド名を出力するカスタム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)