Java 通过 Class isAssignableFrom 方法判断类的父子关系


#Java 反射、泛型与注解#


作用

判断当前类/接口的类对象是否为参数中类对象的相同类/父类/父接口。

源码

// Class.java
public native boolean isAssignableFrom(Class<?> cls);

示例

A.class.isAssignableFrom(B.class) 本质上实在判断能否进行下面的赋值操作:

A a = new B();

示例1:以 Long 为例

Long 类的父类和接口,源码是:

public final class Long extends Number
        implements Comparable<Long>, Constable, ConstantDesc 

代码测试1:

@Test
public void test_isAssignableFrom() {
    System.out.println(Number.class.isAssignableFrom(Long.class));
    // 以上代码输出: true
    System.out.println(Long.class.isAssignableFrom(Long.class));
    // 以上代码输出: true
    System.out.println(Long.class.isAssignableFrom(Number.class));
    // 以上代码输出: false

    System.out.println(Comparable.class.isAssignableFrom(Long.class));
    // 以上代码输出: true
    System.out.println(Comparable.class.isAssignableFrom(Comparable.class));
    // 以上代码输出: true
    System.out.println(Long.class.isAssignableFrom(Comparable.class));
    // 以上代码输出: false
}

代码测试2:

@Test
public void test_isAssignableFrom() {
    Long num = 0L;
    Object obj = num;
    System.out.println(obj.getClass().isAssignableFrom(Long.class));
    // 以上代码输出: true
    System.out.println(obj.getClass().isAssignableFrom(Number.class));
    // 以上代码输出: false
    System.out.println(obj.getClass().isAssignableFrom(Integer.class));
    // 以上代码输出: false
}

( 本文完 )