1.8_1 自省继承层次
getSupperClass 仅仅是 Class 提供的继承相关的反射方法之一,还有其他方法如下表所示:
| 方法 | 说明 |
|---|---|
| Class[] getInterfaces() | 返回表示 直接接口 的 Class 对象数组 |
| Class[] getSuperclass() | 返回表示 直接父类 的 Class 对象,若调用对象为 Object interface primitive void 则返回 null |
| boolean isAssignableFrom(Class cls) | 若调用对象(类、接口)是 cls 的父类或同为 cls 类,则返回 true |
| boolean isInstance(Object obj) | 若 obj 是调用对象类的 实例,返回 true |
getInterfaces 方法返回接口,调用该方法的 Class 对象有两种情况:
- 调用
Class对象表示 普通类,则返回implements关键字后面的接口。 - 调用
Class对象表示 接口,则返回extends关键字后面的接口。
getInterfaces 和 getSuperclass 方法与 Java 概念稍有不同,在 Java 中,只有在 继承树 可达,即为父类,但在反射 API 中,getSuperclass 返回的是 extends 关键字后面的父类,即 直接父类,getInterfaces 同样也仅返回直接接口。
使用 Class.isAssignableFrom 判断一个类是否是另外一个类的 子类/父类:
// 是否可用 y 的实例对 x 实例赋值? x = ys
x.isAssignableFrom(y);
下面是一些例子:
// true
Object.class.isAssignableFrom(String.class);
java.util.List.class.isAssignableFrom(java.util.Vector.class);
double.class.isAssignbaleFrom(double.class);
// false
Object.class.isAssignbaleFrom(double.class);
// true
Object.class.isAssignbaleFrom(Double.class);
double是原始类型,其值不能赋值给Object类对象。Double是原始类型的包装类,父类为Object。
isInstance 是 Java 中 instanceof 关键字的反射版本,看下面的例子:
ClassObject.isInstanceof(InstanceObject);
- 若
ClassObject为 普通类,则若InstanceObject类型为ClassObject或其 子类,返回true。 - 若
ClassObject为 接口,则若InstanceObject的类 实现ClassObject接口或其 子接口,返回true。