获取继承关系
约 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