Java class的isAssignableFrom方法作用

先看注释

/**
 * Determines if the class or interface represented by this
 * {@code Class} object is either the same as, or is a superclass or
 * superinterface of, the class or interface represented by the specified
 * {@code Class} parameter. It returns {@code true} if so;
 * otherwise it returns {@code false}. If this {@code Class}
 * object represents a primitive type, this method returns
 * {@code true} if the specified {@code Class} parameter is
 * exactly this {@code Class} object; otherwise it returns
 * {@code false}.
 *
 * <p> Specifically, this method tests whether the type represented by the
 * specified {@code Class} parameter can be converted to the type
 * represented by this {@code Class} object via an identity conversion
 * or via a widening reference conversion. See <em>The Java Language
 * Specification</em>, sections 5.1.1 and 5.1.4 , for details.
 *
 * @param cls the {@code Class} object to be checked
 * @return the {@code boolean} value indicating whether objects of the
 * type {@code cls} can be assigned to objects of this class
 * @exception NullPointerException if the specified Class parameter is
 *            null.
 * @since JDK1.1
 */
public native boolean isAssignableFrom(Class<?> cls);

简单的说,判断参数cls与调用此方法的class是否有相同的父级类或接口(含自身),看例子:

A.java

package com.blueinfinite;

public interface A {
}

B.java

package com.blueinfinite;

public class B implements A {
}

C.java

package com.blueinfinite;

public class C extends B {
}

Test1.java

import com.blueinfinite.A;
import com.blueinfinite.B;
import com.blueinfinite.C;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

@Slf4j
public class Test1 {
    @Test
    public void test_isAssignableFrom(){
        C  c = new C();
        log.info("{}",A.class.isAssignableFrom(c.getClass()));
        log.info("{}",B.class.isAssignableFrom(c.getClass()));
        log.info("{}",C.class.isAssignableFrom(c.getClass()));
        log.info("{}",Object.class.isAssignableFrom(c.getClass()));

        log.info("------------------");

        A  c1 = new C();
        log.info("{}",A.class.isAssignableFrom(c1.getClass()));
        log.info("{}",B.class.isAssignableFrom(c1.getClass()));
        log.info("{}",C.class.isAssignableFrom(c1.getClass()));
        log.info("{}",Object.class.isAssignableFrom(c1.getClass()));
        log.info("------------------");

        A  b = new B();
        log.info("{}",A.class.isAssignableFrom(b.getClass()));
        log.info("{}",B.class.isAssignableFrom(b.getClass()));
        log.info("{}",C.class.isAssignableFrom(b.getClass()));
        log.info("{}",Object.class.isAssignableFrom(b.getClass()));
    }
}


结果:

[main] INFO Test1 - true
[main] INFO Test1 - true
[main] INFO Test1 - true
[main] INFO Test1 - true
[main] INFO Test1 - ------------------
[main] INFO Test1 - true
[main] INFO Test1 - true
[main] INFO Test1 - true
[main] INFO Test1 - true
[main] INFO Test1 - ------------------
[main] INFO Test1 - true
[main] INFO Test1 - true
[main] INFO Test1 - false
[main] INFO Test1 - true

从运行结果来看,Object是所有类的祖先

java | 2018-05-20 07:52:45