获取继承关系


当我们获取到某个Class对象时,实际上就获取到了一个类的类型:

  1. Class cls = String.class; // 获取到String的Class

还可以用实例的getClass()方法获取:

  1. String s = "";
  2. Class cls = s.getClass(); // s是String,因此获取到String的Class

最后一种获取Class的方法是通过Class.forName(""),传入Class的完整类名获取:

  1. Class s = Class.forName("java.lang.String");

这三种方式获取的Class实例都是同一个实例,因为JVM对每个加载的Class只创建一个Class实例来表示它的类型。

获取父类的Class

有了Class实例,我们还可以获取它的父类的Class

获取继承关系 - 图1

运行上述代码,可以看到,Integer的父类类型是NumberNumber的父类是ObjectObject的父类是null。除Object外,其他任何非interfaceClass都必定存在一个父类类型。

获取interface

由于一个类可能实现一个或多个接口,通过Class我们就可以查询到实现的接口类型。例如,查询Integer实现的接口:

获取继承关系 - 图2

运行上述代码可知,Integer实现的接口有:

  • java.lang.Comparable
  • java.lang.constant.Constable
  • java.lang.constant.ConstantDesc

要特别注意:getInterfaces()只返回当前类直接实现的接口类型,并不包括其父类实现的接口类型:

获取继承关系 - 图3

Integer的父类是NumberNumber实现的接口是java.io.Serializable

此外,对所有interfaceClass调用getSuperclass()返回的是null,获取接口的父接口要用getInterfaces()

  1. System.out.println(java.io.DataInputStream.class.getSuperclass()); // java.io.FilterInputStream,因为DataInputStream继承自FilterInputStream
  2. System.out.println(java.io.Closeable.class.getSuperclass()); // null,对接口调用getSuperclass()总是返回null,获取接口的父接口要用getInterfaces()

如果一个类没有实现任何interface,那么getInterfaces()返回空数组。

继承关系

当我们判断一个实例是否是某个类型时,正常情况下,使用instanceof操作符:

  1. Object n = Integer.valueOf(123);
  2. boolean isDouble = n instanceof Double; // false
  3. boolean isInteger = n instanceof Integer; // true
  4. boolean isNumber = n instanceof Number; // true
  5. boolean isSerializable = n instanceof java.io.Serializable; // true

如果是两个Class实例,要判断一个向上转型是否成立,可以调用isAssignableFrom()

  1. // Integer i = ?
  2. Integer.class.isAssignableFrom(Integer.class); // true,因为Integer可以赋值给Integer
  3. // Number n = ?
  4. Number.class.isAssignableFrom(Integer.class); // true,因为Integer可以赋值给Number
  5. // Object o = ?
  6. Object.class.isAssignableFrom(Integer.class); // true,因为Integer可以赋值给Object
  7. // Integer i = ?
  8. Integer.class.isAssignableFrom(Number.class); // false,因为Number不能赋值给Integer

小结

通过Class对象可以获取继承关系:

  • Class getSuperclass():获取父类类型;
  • Class[] getInterfaces():获取当前类实现的所有接口。

通过Class对象的isAssignableFrom()方法可以判断一个向上转型是否可以实现。

读后有收获可以支付宝请作者喝咖啡:

获取继承关系 - 图4