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是基本数据类型或者voidif (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;
@Testpublic void t1() {// TRUESystem.out.println(ClassUtils.isAssignable(A.class, B.class));// TRUESystem.out.println(ClassUtils.isAssignable(C.class, A.class));}static class A implements C {}static class B extends A {}interface C {}
如果 A 是基本类型比如(int.Class),认为 B 是基本类型的包装类,获取其基本类型比较;
@Testpublic void t2() {System.out.println(int.class.isPrimitive());System.out.println(ClassUtils.isAssignable(int.class, Double.class)); //falseSystem.out.println(ClassUtils.isAssignable(int.class, Integer.class)); // true}
A 不是基本类型,那么可能是包装类,获取 rhsType 包装类对比和方法和1相同。
@Testpublic void t3() {// A 不是基本类型,那么可能是包装类,获取 rhsType 包装类对比System.out.println(ClassUtils.isAssignable(Integer.class, Double.class)); //falseSystem.out.println(ClassUtils.isAssignable(Integer.class, int.class)); // true}
