spring-core | org.springframework.util.ClassUtils

isAssignableValue

  1. public static boolean isAssignableValue(Class<?> type, @Nullable Object value) {
  2. Assert.notNull(type, "Type must not be null");
  3. return (value != null ? isAssignable(type, value.getClass()) : !type.isPrimitive());
  4. }

ClassUtils.isAssignableValue(A,B) 判断 A 和 B 的关系。
如果B==null,A 是基本类型返回false,A 是引用类型返回 TRUE;
如果B!=null,参考方法下面的 isAssignable 方法;

isAssignable

  1. public static boolean isAssignable(Class<?> lhsType, Class<?> rhsType) {
  2. Assert.notNull(lhsType, "Left-hand side type must not be null");
  3. Assert.notNull(rhsType, "Right-hand side type must not be null");
  4. // rhsType 判断 rhsType 是否等于/继承/实现 lhsType,是返回 true,否返回 false;
  5. // Class的方法
  6. if (lhsType.isAssignableFrom(rhsType)) {
  7. return true;
  8. }
  9. // 如果lhsType是基本数据类型或者void
  10. if (lhsType.isPrimitive()) {
  11. // 认为rhsType是基本类型的包装类,获取其对应的基本类型
  12. Class<?> resolvedPrimitive = primitiveWrapperTypeMap.get(rhsType);
  13. return (lhsType == resolvedPrimitive);
  14. }
  15. else {
  16. // lhsType不是基本类型,那么可能是包装类,获取rhsType包装类对比
  17. Class<?> resolvedWrapper = primitiveTypeToWrapperMap.get(rhsType);
  18. return (resolvedWrapper != null && lhsType.isAssignableFrom(resolvedWrapper));
  19. }
  20. }

比如:ClassUtils.isAssignableValue(A,B)

  1. A 和 B 均为 Class 对象,判断 B 是否等于/继承/实现A,是返回 TRUE;
  2. A 是基本类型比如(int.Class),认为 B 是基本类型的包装类,获取其基本类型比较;
  3. A 不是基本类型,那么可能是包装类,获取 rhsType 包装类对比和方法和1相同。

测试代码:
A 和 B 均为 Class 对象,判断 B 是否等于/继承/实现A,是返回 TRUE;

  1. @Test
  2. public void t1() {
  3. // TRUE
  4. System.out.println(ClassUtils.isAssignable(A.class, B.class));
  5. // TRUE
  6. System.out.println(ClassUtils.isAssignable(C.class, A.class));
  7. }
  8. static class A implements C {
  9. }
  10. static class B extends A {
  11. }
  12. interface C {
  13. }

如果 A 是基本类型比如(int.Class),认为 B 是基本类型的包装类,获取其基本类型比较;

  1. @Test
  2. public void t2() {
  3. System.out.println(int.class.isPrimitive());
  4. System.out.println(ClassUtils.isAssignable(int.class, Double.class)); //false
  5. System.out.println(ClassUtils.isAssignable(int.class, Integer.class)); // true
  6. }

A 不是基本类型,那么可能是包装类,获取 rhsType 包装类对比和方法和1相同。

  1. @Test
  2. public void t3() {
  3. // A 不是基本类型,那么可能是包装类,获取 rhsType 包装类对比
  4. System.out.println(ClassUtils.isAssignable(Integer.class, Double.class)); //false
  5. System.out.println(ClassUtils.isAssignable(Integer.class, int.class)); // true
  6. }