获取一个对象的直接接口和间接接口

package com.ljr;

import java.util.*;

public class InterfaceUtils {

    public static List> getInterfaces(Object obj) {
        List> interfaces = new ArrayList<>();
        Class clazz = obj.getClass();
        while (clazz != null) {
            Class[] directInterfaces = clazz.getInterfaces();
            interfaces.addAll(Arrays.asList(directInterfaces));//直接接口
            for (Class directInterface : directInterfaces) {
                interfaces.addAll(getIndirectInterfaces(directInterface));//接口的接口
            }
            clazz = clazz.getSuperclass();//直接父类和间接父类的接口
        }
        return interfaces;
    }

    private static List> getIndirectInterfaces(Class clazz) {
        List> indirectInterfaces = new ArrayList<>();
        Class[] interfaces = clazz.getInterfaces();
        for (Class interfaceClass : interfaces) {
            indirectInterfaces.add(interfaceClass);
            indirectInterfaces.addAll(getIndirectInterfaces(interfaceClass));
        }
        return indirectInterfaces;
    }

    public static void main(String[] args) {
        // 示例用法
        Object obj = new LinkedHashMap<>();
        List> interfaces = getInterfaces(obj);
        for (Class interfaceClass : interfaces) {
            System.out.println(interfaceClass.getName());
        }
    }
}

运行结果:
获取一个对象的直接接口和间接接口_第1张图片

存在的问题:
该方法可以获取对象的直接接口和间接接口,但是会重复存放。

解决方案:
我们使用了一个HashSet来存储接口,这样可以自动去重。最后,我们将HashSet转换为ArrayList,以便返回一个有序的接口列表。

package com.ljr;

import java.util.*;

public class InterfaceUtils {

    public static List> getInterfaces(Object obj) {
        //List> interfaces = new ArrayList<>();
        Set> interfaces = new HashSet<>();
        Class clazz = obj.getClass();
        while (clazz != null) {
            Class[] directInterfaces = clazz.getInterfaces();
            interfaces.addAll(Arrays.asList(directInterfaces));//直接接口
            for (Class directInterface : directInterfaces) {
                interfaces.addAll(getIndirectInterfaces(directInterface));//接口的接口
            }
            clazz = clazz.getSuperclass();//直接父类和间接父类的接口
        }
        return new ArrayList<>(interfaces);
    }

    private static List> getIndirectInterfaces(Class clazz) {
        List> indirectInterfaces = new ArrayList<>();
        Class[] interfaces = clazz.getInterfaces();
        for (Class interfaceClass : interfaces) {
            indirectInterfaces.add(interfaceClass);
            indirectInterfaces.addAll(getIndirectInterfaces(interfaceClass));
        }
        return indirectInterfaces;
    }

    public static void main(String[] args) {
        // 示例用法
        Object obj = new LinkedHashMap<>();
        List> interfaces = getInterfaces(obj);
        for (Class interfaceClass : interfaces) {
            System.out.println(interfaceClass.getName());
        }
    }
}

你可能感兴趣的:(java基础,java)