LoginSignup
2
0

More than 5 years have passed since last update.

とあるクラスのスーパークラスとインターフェイスを再帰的に取得したい

Posted at

プログラム設計書を書く――というかソースコードからプログラム設計書を起こす機会があったのですが、その設計書が「作成した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 */
    }
}

「クラスそのものがクラスとして扱える」というのは少し奇妙ですが、慣れると便利ですね。メタプログラミング万歳(´・ω・`)

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0