spring-core | org.springframework.util.ClassUtils
isAssignableValue
public static boolean isAssignableValue(Class<?> type, @Nullable Object value) {
Assert.notNull(type, "Type must not be null");
return (value != null ? isAssignable(type, value.getClass()) : !type.isPrimitive());
}
ClassUtils.isAssignableValue(A,B) 判断 A 和 B 的关系。
如果B==null,A 是基本类型返回false,A 是引用类型返回 TRUE;
如果B!=null,参考方法下面的 isAssignable 方法;
isAssignable
public static boolean isAssignable(Class<?> lhsType, Class<?> rhsType) {
Assert.notNull(lhsType, "Left-hand side type must not be null");
Assert.notNull(rhsType, "Right-hand side type must not be null");
// rhsType 判断 rhsType 是否等于/继承/实现 lhsType,是返回 true,否返回 false;
// Class的方法
if (lhsType.isAssignableFrom(rhsType)) {
return true;
}
// 如果lhsType是基本数据类型或者void
if (lhsType.isPrimitive()) {
// 认为rhsType是基本类型的包装类,获取其对应的基本类型
Class<?> resolvedPrimitive = primitiveWrapperTypeMap.get(rhsType);
return (lhsType == resolvedPrimitive);
}
else {
// lhsType不是基本类型,那么可能是包装类,获取rhsType包装类对比
Class<?> resolvedWrapper = primitiveTypeToWrapperMap.get(rhsType);
return (resolvedWrapper != null && lhsType.isAssignableFrom(resolvedWrapper));
}
}
比如:ClassUtils.isAssignableValue(A,B)
- A 和 B 均为 Class 对象,判断 B 是否等于/继承/实现A,是返回 TRUE;
- A 是基本类型比如(int.Class),认为 B 是基本类型的包装类,获取其基本类型比较;
- A 不是基本类型,那么可能是包装类,获取 rhsType 包装类对比和方法和1相同。
测试代码:
A 和 B 均为 Class 对象,判断 B 是否等于/继承/实现A,是返回 TRUE;
@Test
public void t1() {
// TRUE
System.out.println(ClassUtils.isAssignable(A.class, B.class));
// TRUE
System.out.println(ClassUtils.isAssignable(C.class, A.class));
}
static class A implements C {
}
static class B extends A {
}
interface C {
}
如果 A 是基本类型比如(int.Class),认为 B 是基本类型的包装类,获取其基本类型比较;
@Test
public void t2() {
System.out.println(int.class.isPrimitive());
System.out.println(ClassUtils.isAssignable(int.class, Double.class)); //false
System.out.println(ClassUtils.isAssignable(int.class, Integer.class)); // true
}
A 不是基本类型,那么可能是包装类,获取 rhsType 包装类对比和方法和1相同。
@Test
public void t3() {
// A 不是基本类型,那么可能是包装类,获取 rhsType 包装类对比
System.out.println(ClassUtils.isAssignable(Integer.class, Double.class)); //false
System.out.println(ClassUtils.isAssignable(Integer.class, int.class)); // true
}