Java反射:获取类的继承关系与接口信息

在Java反射机制中,可以通过Class对象获取类的继承结构和实现的接口信息。以下是关键方法和实现步骤:

核心方法
  1. 获取直接父类
    Class<?> getSuperclass()
    返回直接继承的父类,若当前类是Object或接口则返回null
    示例:

    Class<?> superClass = MyClass.class.getSuperclass();
    

  2. 获取直接实现的接口
    Class<?>[] getInterfaces()
    返回类直接实现的接口数组(不包括父类实现的接口)
    示例:

    Class<?>[] interfaces = MyClass.class.getInterfaces();
    


完整继承链与接口收集
import java.util.*;

public class ReflectDemo {
    public static void main(String[] args) {
        // 示例:获取String类的继承关系和接口
        printClassHierarchy(String.class);
    }

    // 打印完整类结构
    public static void printClassHierarchy(Class<?> clazz) {
        System.out.println("类名: " + clazz.getName());
        System.out.println("\n继承链:");
        getInheritanceChain(clazz).forEach(c -> System.out.println("↳ " + c.getName()));

        System.out.println("\n实现接口:");
        getAllInterfaces(clazz).forEach(i -> System.out.println("• " + i.getName()));
    }

    // 获取完整继承链(从当前类到Object)
    public static List<Class<?>> getInheritanceChain(Class<?> clazz) {
        List<Class<?>> chain = new ArrayList<>();
        while (clazz != null) {
            chain.add(clazz);
            clazz = clazz.getSuperclass(); // 向上追溯父类
        }
        return chain;
    }

    // 获取所有接口(包括继承的接口)
    public static Set<Class<?>> getAllInterfaces(Class<?> clazz) {
        Set<Class<?>> interfaces = new LinkedHashSet<>();
        
        // 递归获取当前类和父类的接口
        while (clazz != null) {
            for (Class<?> iface : clazz.getInterfaces()) {
                interfaces.add(iface);
                interfaces.addAll(getAllInterfaces(iface)); // 递归接口继承
            }
            clazz = clazz.getSuperclass(); // 向上追溯父类
        }
        return interfaces;
    }
}

执行结果示例(以java.lang.String为例)
类名: java.lang.String

继承链:
↳ java.lang.String
↳ java.lang.Object

实现接口:
• java.io.Serializable
• java.lang.Comparable
• java.lang.CharSequence


关键说明
  1. 接口继承处理
    当接口继承其他接口时,getAllInterfaces()方法通过递归确保完整收集所有父接口。

  2. 类型判定

    • 基础类型(如int.class)无父类和接口
    • 接口类型(如List.class)的getSuperclass()返回null
  3. 复杂度分析

    • 继承链获取:$O(n)$(n为继承深度)
    • 接口收集:$O(m \times k)$(m为类深度,k为接口数)

最佳实践:结合isInterface()isArray()等方法,可构建完整的类型关系图谱,适用于框架开发、序列化工具等场景。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐