Рекурсивный вызов суперкласса. Рефлексия

Нужно написать рекурсивный метод, показывающий всех родителей переданного в параметр объекта, кроме Object. Например, для объекта кошка: Кошачие, Млекопитающие, Животные...

Пробовал так, но получил бесконечную рекурсию:

public class ShowParent {

ArrayList list = new ArrayList();


public void getAllParentsExceptObject(Class investigatedClass) {
    Class currentClass = investigatedClass.getClass();
    list.add(currentClass.getSuperclass());
    getAllParentsExceptObject((Class) list.get(list.size()-1));
}

public static void main(String[] args) {
    TheCat cat = new TheCat();
    ShowParent sp = new ShowParent();
    sp.getAllParentsExceptObject(cat.getClass());
    System.out.println(sp.list.toString());
}

}

И так:

public void getAllParentsExceptObject() {
    if (!this.getClass().equals(Object.class)) {
    this.getClass().getSuperclass();
    getAllParentsExceptObject();
}}

Та же бесконечная рекурсия


Ответы (2 шт):

Автор решения: Alexandr

Вариант с использованием Stream API:

public static Stream<Class<?>> getSuperclasses(Class<?> clazz) {
    if (Object.class.equals(clazz)) {
        return Stream.empty();
    } else {
        return Stream.concat(
                Stream.of(clazz),
                getSuperclasses(clazz.getSuperclass()));
    }
}

public static void main(String[] args) {
    System.out.println(
            getSuperclasses(TheCat.class)
                    .map(Class::getSimpleName)
                    .collect(Collectors.joining(", ")));
}
→ Ссылка
Автор решения: Barmaley

А нельзя совсем просто?

public List<Class> getAllParentsExceptObject(List<Class> parents, Class investigatedClass) {
    Class currentClass = investigatedClass;
    if(currentClass.equals(Object.class))
        return parents;
    parents.add(currentClass);
    Class superClass=currentClass.getSuperclass());
    return getAllParentsExceptObject(parents, superClass);
}

public static void main(String[] args) {
    TheCat cat = new TheCat();
    ShowParent sp = new ShowParent();
    List<Class> parents=sp.getAllParentsExceptObject(new ArrayList<Class>(), cat.getClass());
    System.out.println(parents);
}
→ Ссылка