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
。