获取继承关系
350字约1分钟
2024-08-10
获取父类的Class
Class getSuperclass()
获取父类类型
public static void main(String[] args) throws Exception {
Class iCls = Integer.class;
// 获取 Integer 父类 Class
Class superCls = iCls.getSuperclass();
System.out.println(superCls); // class java.lang.Number
// 获取 Integer 父类的父类 Class
Class superCls2 = superCls.getSuperclass();
System.out.println(superCls2); // class java.lang.Object
System.out.println(superCls2.getSuperclass()); // null
}
Integer
的父类类型是 Number
,Number
的父类是 Object
,Object
的父类是 null
。除 Object
外,其他任何非 interface
的 Class
都必定存在一个父类类型
获取interface
Class[] getInterfaces()
获取当前类实现的所有接口
public static void main(String[] args) throws Exception {
Class iCls = Integer.class;
Class[] interfaces = iCls.getInterfaces();
// 结果:interface java.lang.Comparable
for (Class cls : interfaces) {
System.out.println(cls);
}
}
getInterfaces()
只返回当前类直接实现的接口类型,并不包括其父类实现的接口类型
继承关系
当我们判断一个实例是否是某个类型时,正常情况下,使用 instanceof
操作符
Object n = Integer.valueOf(123);
boolean isDouble = n instanceof Double; // false
boolean isInteger = n instanceof Integer; // true
boolean isNumber = n instanceof Number; // true
boolean isSerializable = n instanceof java.io.Serializable; // true
如果是两个 Class
实例,要判断一个向上转型是否成立,可以调用 isAssignableFrom()
// Integer i = ?
Integer.class.isAssignableFrom(Integer.class); // true,因为Integer可以赋值给Integer
// Number n = ?
Number.class.isAssignableFrom(Integer.class); // true,因为Integer可以赋值给Number
// Object o = ?
Object.class.isAssignableFrom(Integer.class); // true,因为Integer可以赋值给Object
// Integer i = ?
Integer.class.isAssignableFrom(Number.class); // false,因为Number不能赋值给Integer