一、继承关系获取的核心API
Java反射提供两大关键方法获取类的直接继承关系:
// 获取直接父类
Class<?> superClass = String.class.getSuperclass(); // 返回Object.class
// 获取直接实现的接口
Class<?>[] interfaces = List.class.getInterfaces(); // 返回[Collection.class]
二、递归遍历:破解完整继承链
实际开发常需获取完整的父类继承链或接口树:
public static List<Class<?>> getAllSuperclasses(Class<?> clazz) {
List<Class<?>> classes = new ArrayList<>();
Class<?> superclass = clazz.getSuperclass();
// 递归终止条件:到达Object或null
while (superclass != null && superclass != Object.class) {
classes.add(superclass);
superclass = superclass.getSuperclass();
}
return classes;
}
三、实战:完整继承关系分析工具
以下工具类支持获取父类链+接口树:
import java.util.*;
public class ReflectionUtils {
// 获取所有父类(包含自身)
public static List<Class<?>> getClassHierarchy(Class<?> clazz) {
List<Class<?>> hierarchy = new ArrayList<>();
while (clazz != null && clazz != Object.class) {
hierarchy.add(clazz);
clazz = clazz.getSuperclass();
}
Collections.reverse(hierarchy); // 按继承顺序排序
return hierarchy;
}
// 获取所有实现接口(含父类接口)
public static Set<Class<?>> getAllInterfaces(Class<?> clazz) {
Set<Class<?>> interfaces = new HashSet<>();
while (clazz != null) {
interfaces.addAll(Arrays.asList(clazz.getInterfaces()));
clazz = clazz.getSuperclass(); // 向上追溯父类接口
}
return interfaces;
}
public static void main(String[] args) {
// 示例:分析ArrayList的继承关系
List<Class<?>> hierarchy = getClassHierarchy(ArrayList.class);
System.out.println("继承链: " + hierarchy);
// [java.lang.Object, java.util.AbstractList, java.util.ArrayList]
Set<Class<?>> interfaces = getAllInterfaces(ArrayList.class);
System.out.println("接口树: " + interfaces);
// [java.util.List, java.util.RandomAccess, java.lang.Cloneable, ...]
}
}
四、应用场景与风险提示
典型应用场景:
- 框架开发:Spring的依赖注入通过继承关系查找Bean
- 注解处理器:扫描特定父类/接口的注解
- 序列化工具:动态解析对象结构
风险规避:
// 1. 性能敏感场景慎用反射(缓存Class对象)
private static final Map<String, Class<?>> CLASS_CACHE = new ConcurrentHashMap<>();
// 2. 安全检查(防止非法访问)
if (!Modifier.isPublic(clazz.getModifiers())) {
throw new IllegalAccessException("非公开类禁止访问");
}
关键结论:反射虽能穿透继承关系,但务必配合isAssignableFrom()进行类型安全校验,避免ClassCastException。
掌握反射分析继承关系的能力,相当于获得Java类型系统的“透视镜”。合理运用此技术可大幅提升框架灵活性,但切记反射是重型操作——在性能关键路径使用时需谨慎评估,并优先考虑安全的类型判断API替代方案。
1827

被折叠的 条评论
为什么被折叠?



