プログラム設計書を書く――というかソースコードからプログラム設計書を起こす機会があったのですが、その設計書が「作成したJavaクラスに親クラス名すべてと実装しているインターフェイスすべてを併記しなさい」というものでした。これを馬鹿正直に手で作るのは面倒。そこで「クラス名から親クラスとインターフェイスを再帰的に求める」というプログラムを書くことにしました。以下はそのサンプルになります。
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
// クラス名からクラスオブジェクトを生成する。
Class<?> pivotClass = Class.forName("java.util.ArrayList");
// スーパークラスを再帰的にたどる。
List<Class<?>> classes = new ArrayList<>();
Class<?> superClass = pivotClass;
while (superClass != null) {
classes.add(superClass);
superClass = superClass.getSuperclass();
}
// 再帰的に取得したスーパークラスの一覧を取得する。
for (Class<?> clazz : classes) {
System.out.println(clazz.getName());
}
/* java.util.ArrayList
java.util.AbstractList
java.util.AbstractCollection
java.lang.Object */
// 実装しているインターフェイスの一覧を取得&出力する。
Class<?>[] interfaces = pivotClass.getInterfaces();
for (Class<?> interfaze : interfaces) {
System.out.println(interfaze.getName());
}
/* java.util.List
java.util.RandomAccess
java.lang.Cloneable
java.io.Serializable */
}
}
「クラスそのものがクラスとして扱える」というのは少し奇妙ですが、慣れると便利ですね。メタプログラミング万歳(´・ω・`)