Java反射通过getSuperclass()获取单个直接父类(无父类时返回null),通过getInterfaces()获取直接实现的接口数组(无接口时为空数组),二者均只返回直接关系,不包含间接继承或实现。

Java 反射机制可以通过 Class 对象直接获取类的继承关系:父类只有一个(单继承),接口可以有多个(多实现)。核心方法简单明确,无需额外依赖。
获取父类:getSuperclass()
调用 clazz.getSuperclass() 返回直接父类的 Class 对象。注意:
- 如果该类是
Object、接口、基本类型或void,返回null - 数组类型会返回
java.lang.Object - 返回值是单个
Class<? super T>,不是数组
示例:
Class<?> c = String.class;<br>Class<?> parent = c.getSuperclass(); // 返回 Class<?> 表示 java.lang.Object<br>System.out.println(parent.getSimpleName()); // 输出 "Object"
获取所有实现的接口:getInterfaces()
调用 clazz.getInterfaces() 返回一个 Class[] 数组,包含当前类**直接实现**的所有接口(不包括父类实现的接口)。
- 若类未显式实现任何接口,数组长度为 0(不是
null) - 接口本身调用该方法,返回其继承的父接口数组
- 数组元素顺序与源码中
implements的声明顺序一致
示例:
Class<?> c = Integer.class;<br>Class<?>[] interfaces = c.getInterfaces();<br>for (Class<?> intf : interfaces) {<br> System.out.println(intf.getSimpleName()); // 如 Comparable、Constable 等<br>}
补充说明:区分直接与间接继承/实现
反射只提供**直接**的继承和实现信息:
立即学习“Java免费学习笔记(深入)”;
-
getSuperclass()不会递归返回祖父类;如需完整继承链,需循环调用直到返回null -
getInterfaces()不包含父类已实现的接口;要获取全部可调用接口,需手动遍历类及其所有父类的getInterfaces() - 判断某类型是否可赋值给另一类型,应使用
isAssignableFrom(Class),而非仅靠反射查表
常见误点提醒
使用时注意几个易错细节:
- 泛型擦除:接口数组里拿不到泛型信息(如
List<String>显示为List) - 访问权限不影响获取:即使父类或接口是
private或包私有,只要能加载,反射仍可获取其Class对象 - 数组类特殊:如
int[].class.getSuperclass()返回Object.class,而int[].class.getInterfaces()返回空数组


















