java 获取类的所有(派生)接口

b1payxdu  于 2023-11-15  发布在  Java
关注(0)|答案(5)|浏览(175)

java.lang.Class.getInterfaces返回所有直接实现的接口,即不遍历类树以获取所有父类型的所有接口。例如,层次结构

public interface A {}
public interface B {}
public interface C extends B {}

public class Foo implements A {} // Foo.class.getInterfaces() returns [A]
public class Bar implements C {} // Bar.class.getInterfaces() returns [C], note B is not included.

字符串
对于Bar,我想得到[B, C],但对于任意树深度。
我可以自己写这个,但我相信一定有一个图书馆已经这样做了,任何想法?

sycxhyv7

sycxhyv71#

Apache Commons Lang有你需要的方法:ClassUtils.getAllInterfaces

ao218c7q

ao218c7q2#

Guava溶液:

final Set<TypeToken> tt = TypeToken.of(cls).getTypes().interfaces();

字符串
这是一个比古老的Apache更强大、更清晰的反射API。

c86crjj0

c86crjj03#

别忘了,Spring Framework有很多类似的util类,比如Apache Commons Lang。所以有:org.springframework.util.ClassUtils#getAllInterfaces

8iwquhpp

8iwquhpp4#

public Stream<Class<?>> getInterfaces(Class<?> type) {
    return Stream.of(type.getInterfaces())
                 .flatMap(interfaceType -> Stream.concat(Stream.of(interfaceType), getInterfaces(interfaceType)));
}

字符串

camsedfj

camsedfj5#

public interface A {}

public interface B {}

public interface E extends B{ }

public class C implements A{}

public class D extends C implements E{}

字符串


的数据

public class App {

    public static void main(String[] args) {

        final List<Class<?>> result = getAllInterfaces(D.class);            
        for (Class<?> clazz : result) {
            System.out.println(clazz);
        }
    }

    public static List<Class<?>> getAllInterfaces(Class<?> clazz) {
        if (clazz == null) {
            System.out.println(">>>>>>>>>> Log : null argument ");
            return new ArrayList<>();
        }
        List<Class<?>> interfacesFound = new ArrayList<>();
        getAllInterfaces(clazz, interfacesFound);
        return interfacesFound;
    }

    private static void getAllInterfaces(Class<?> clazz,
                                         List<Class<?>> interfacesFound) {
        while (clazz != null) {
            Class<?>[] interfaces = clazz.getInterfaces();

            for (int i = 0; i < interfaces.length; i++) {
                if (!interfacesFound.contains(interfaces[i])) {
                    interfacesFound.add(interfaces[i]);
                    getAllInterfaces(interfaces[i], interfacesFound);
                }
            }
            clazz = clazz.getSuperclass();
        }
    }
}

相关问题