Java反射(5)获取继承关系

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

  • 1.Class getSuperclass():获取父类类型;(单继承)
  • 2.Class[] getInterfaces():获取当前类实现的所有接口;(多实现)
  • 3.通过Class对象的isAssignableFrom()方法,判断Class向上转型是否可以实现。

1.获取父类类型

public class Main {
    public static void main(String[] args) throws Exception {
        Class i = Integer.class;
        Class n = i.getSuperclass();
        System.out.println(n);
        Class o = n.getSuperclass();
        System.out.println(o);
        System.out.println(o.getSuperclass());
    }
}

输出:

class java.lang.Number 
class java.lang.Object 
null 

Integer的父类类型是Number,Number的父类是Object,Object的父类是null。除Object外,其他任何非interface的Class都必定存在一个父类类型。

2.获取当前类实现的所有接口

public class Main {
    public static void main(String[] args) throws Exception {
        Class s = Integer.class;
        Class[] is = s.getInterfaces();
        for (Class i : is) {
            System.out.println(i);
        }
    }
}

输出Integer实现的接口有:

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

3.判断Class向上转型

在非反射调用中,当我们判断一个实例是否是某个类型时,正常情况下,使用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

博客来源:
https://www.liaoxuefeng.com/wiki/1252599548343744/1264804244564000

posted @ 2020-04-17 00:17  JohnTesla  阅读(1142)  评论(0编辑  收藏  举报