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