从 0 学 Java(22):反射获取类的继承关系与接口信息,理清类结构
·
Java反射:获取类的继承关系与接口信息
在Java反射机制中,可以通过Class对象获取类的继承结构和实现的接口信息。以下是关键方法和实现步骤:
核心方法
-
获取直接父类
Class<?> getSuperclass()
返回直接继承的父类,若当前类是Object或接口则返回null
示例:Class<?> superClass = MyClass.class.getSuperclass(); -
获取直接实现的接口
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
关键说明
-
接口继承处理
当接口继承其他接口时,getAllInterfaces()方法通过递归确保完整收集所有父接口。 -
类型判定
- 基础类型(如
int.class)无父类和接口 - 接口类型(如
List.class)的getSuperclass()返回null
- 基础类型(如
-
复杂度分析
- 继承链获取:$O(n)$(n为继承深度)
- 接口收集:$O(m \times k)$(m为类深度,k为接口数)
最佳实践:结合
isInterface()和isArray()等方法,可构建完整的类型关系图谱,适用于框架开发、序列化工具等场景。
更多推荐

所有评论(0)