Class.isAssignableFrom()

2025/04/17

一、背景

在 spring 加载配置类,处理注解@Import1时,针对candidate做了比较,比较时就使用了Class中的isAssignableFrom()方法。

for (SourceClass candidate : importCandidates){
    if(candidate.isAssignable(ImportSelector .class)){}
    else if(candidate.isAssignable(ImportBeanDefinitionRegistrar .class)){}
    else{}
}

二、使用

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

其中

关系备注
类继承关系父类.isAssignableFrom(子类) → true
接口实现关系接口.isAssignableFrom(实现类) → true
自身比较A.isAssignableFrom(A) → true
原始类型与包装类原始类型(如 int)和其包装类(如 Integer)不兼容

三、测试代码

public class AssignFromTest {
    public static void main(String[] args) {
        // 接口实现
        // false
        System.out.println(ArrayList.class.isAssignableFrom(List.class));
        // true
        System.out.println(List.class.isAssignableFrom(ArrayList.class));

        // 自身比较 true
        System.out.println(Client.class.isAssignableFrom(Client.class));

        // 继承
        // true
        System.out.println(Number.class.isAssignableFrom(Integer.class));
        // false
        System.out.println(Integer.class.isAssignableFrom(Number.class));

        // 原始类型和包装类型
        // false
        System.out.println(int.class.isAssignableFrom(Integer.class));
        // false
        System.out.println(Integer.class.isAssignableFrom(int.class));

        // 数组
        // true
        System.out.println(Object[].class.isAssignableFrom(String[].class));
        // false
        System.out.println(String[].class.isAssignableFrom(Object.class));
    }
}

运行结果

img.png

四、和 instanceof 的区别


  1. 逻辑位于 org.springframework.context.annotation.ConfigurationClassParser#processImports ↩︎