一、背景
在 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);
其中
cls
是待检查的类- 如果调用方法的类是
cls
的父类、实现的接口,或者与cls
本身相同,返回 true.
关系 | 备注 |
---|---|
类继承关系 | 父类.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));
}
}
运行结果
四、和 instanceof 的区别
- isAssignableFrom(): 类与类之间的关系(Class对象之间)
- instanceof: 是对象实例与类之间的关系
逻辑位于
org.springframework.context.annotation.ConfigurationClassParser#processImports
↩︎