Package org.springframework.core

Examples of org.springframework.core.ResolvableType


        }
        return false;
    }

    private TypeDescriptor getGenericType(ResolvableType targetType) throws NoSuchFieldException, IllegalAccessException {
        ResolvableType generic = targetType.getGeneric(0);
        return TypeDescriptor.valueOf(generic.getRawClass());
    }
View Full Code Here


    public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
        if (source == null) {
            return null;
        }
        try {
            ResolvableType tgtResolvableType = getResolvableType(targetType);
            TypeDescriptor typeDescriptor = getGenericType(tgtResolvableType);
            //TODO: discover propName
            String propName = "hello.defaultMessage";
            //TODO: discover defaultValue
            Object defaultValue = conversionService.convert(source, sourceType, typeDescriptor);
View Full Code Here

//        ParameterizedType parameterizedType = (ParameterizedType) ABService.class.getGenericInterfaces()[0];
//        Type genericType = parameterizedType.getActualTypeArguments()[1];

        //得到类型上的泛型   如果你的类可能被代理 可以通过ClassUtils.getUserClass(ABService.class)得到原有的类型
        ResolvableType resolvableType1 = ResolvableType.forClass(ABService.class);

        //resolvableType1.getSuperType(); 得到父类
        //以下是得到接口上的
        System.out.println(resolvableType1.getInterfaces()[0].getGeneric(1).resolve());
        //转换为某个类型(父类/实现的接口)  还提供了简便方法 asMap() /asCollection
        System.out.println(resolvableType1.as(Service.class).getGeneric(1).resolve());


        ///得到字段的
        ResolvableType resolvableType2 =
                ResolvableType.forField(ReflectionUtils.findField(GenricInjectTest.class, "cdService"));
        System.out.println(resolvableType2.getGeneric(0).resolve()); //得到某个位置的 如<C, D>  0就是C 1就是D

        //嵌套的
        ResolvableType resolvableType3 =
                ResolvableType.forField(ReflectionUtils.findField(GenricInjectTest.class, "list"));
        System.out.println(resolvableType3.getGeneric(0).getGeneric(0).resolve());

        //Map嵌套
        ResolvableType resolvableType4 =
                ResolvableType.forField(ReflectionUtils.findField(GenricInjectTest.class, "map"));
        System.out.println(resolvableType4.getGeneric(1).getGeneric(1).resolve());
        System.out.println(resolvableType4.getGeneric(1, 1).resolve());

        //方法返回值
        ResolvableType resolvableType5 =
                ResolvableType.forMethodReturnType(ReflectionUtils.findMethod(GenricInjectTest.class, "method"));
        System.out.println(resolvableType5.getGeneric(1, 0).resolve());

        //构造器参数
        ResolvableType resolvableType6 =
                ResolvableType.forConstructorParameter(ClassUtils.getConstructorIfAvailable(Const.class, List.class, Map.class), 1);
        System.out.println(resolvableType6.getGeneric(1, 0).resolve());

        //数组
        ResolvableType resolvableType7 =
                ResolvableType.forField(ReflectionUtils.findField(GenricInjectTest.class, "array"));
        System.out.println(resolvableType7.isArray());
        System.out.println(resolvableType7.getComponentType().getGeneric(0).resolve());

        //自定义一个泛型数组 List<String>[]
        ResolvableType resolvableType8 = ResolvableType.forClassWithGenerics(List.class, String.class);
        ResolvableType resolvableType9 = ResolvableType.forArrayComponent(resolvableType8);
        System.out.println(resolvableType9.getComponentType().getGeneric(0).resolve());

        //比较两个泛型是否可以赋值成功
        System.out.println(resolvableType7.isAssignableFrom(resolvableType9));

        ResolvableType resolvableType10 = ResolvableType.forClassWithGenerics(List.class, Integer.class);
        ResolvableType resolvableType11 = ResolvableType.forArrayComponent(resolvableType10);
        System.out.println(resolvableType11.getComponentType().getGeneric(0).resolve());

        System.out.println(resolvableType7.isAssignableFrom(resolvableType11));


    }
View Full Code Here

  /**
   * Match the given dependency type with its generic type information against the given
   * candidate bean definition.
   */
  protected boolean checkGenericTypeMatch(BeanDefinitionHolder bdHolder, DependencyDescriptor descriptor) {
    ResolvableType dependencyType = descriptor.getResolvableType();
    if (dependencyType.getType() instanceof Class) {
      // No generic type -> we know it's a Class type-match, so no need to check again.
      return true;
    }
    ResolvableType targetType = null;
    RootBeanDefinition rbd = null;
    if (bdHolder.getBeanDefinition() instanceof RootBeanDefinition) {
      rbd = (RootBeanDefinition) bdHolder.getBeanDefinition();
    }
    if (rbd != null) {
      // First, check factory method return type, if applicable
      targetType = getReturnTypeForFactoryMethod(rbd, descriptor);
      if (targetType == null) {
        RootBeanDefinition dbd = getResolvedDecoratedDefinition(rbd);
        if (dbd != null) {
          targetType = getReturnTypeForFactoryMethod(dbd, descriptor);
        }
      }
    }
    if (targetType == null) {
      // Regular case: straight bean instance, with BeanFactory available.
      if (this.beanFactory != null) {
        Class<?> beanType = this.beanFactory.getType(bdHolder.getBeanName());
        if (beanType != null) {
          targetType = ResolvableType.forClass(ClassUtils.getUserClass(beanType));
        }
      }
      // Fallback: no BeanFactory set, or no type resolvable through it
      // -> best-effort match against the target class if applicable.
      if (targetType == null && rbd != null && rbd.hasBeanClass() && rbd.getFactoryMethodName() == null) {
        Class<?> beanClass = rbd.getBeanClass();
        if (!FactoryBean.class.isAssignableFrom(beanClass)) {
          targetType = ResolvableType.forClass(ClassUtils.getUserClass(beanClass));
        }
      }
    }
    if (targetType == null || (descriptor.fallbackMatchAllowed() && targetType.hasUnresolvableGenerics())) {
      return true;
    }
    // Full check for complex generic type match...
    return dependencyType.isAssignableFrom(targetType);
  }
View Full Code Here

   */
  public TypeDescriptor narrow(Object value) {
    if (value == null) {
      return this;
    }
    ResolvableType narrowed = ResolvableType.forType(value.getClass(), this.resolvableType);
    return new TypeDescriptor(narrowed, null, this.annotations);
  }
View Full Code Here

  public static TypeDescriptor collection(Class<?> collectionType, TypeDescriptor elementTypeDescriptor) {
    Assert.notNull(collectionType, "collectionType must not be null");
    if (!Collection.class.isAssignableFrom(collectionType)) {
      throw new IllegalArgumentException("collectionType must be a java.util.Collection");
    }
    ResolvableType element = (elementTypeDescriptor != null ? elementTypeDescriptor.resolvableType : null);
    return new TypeDescriptor(ResolvableType.forClassWithGenerics(collectionType, element), null, null);
  }
View Full Code Here

   */
  public static TypeDescriptor map(Class<?> mapType, TypeDescriptor keyTypeDescriptor, TypeDescriptor valueTypeDescriptor) {
    if (!Map.class.isAssignableFrom(mapType)) {
      throw new IllegalArgumentException("mapType must be a java.util.Map");
    }
    ResolvableType key = (keyTypeDescriptor != null ? keyTypeDescriptor.resolvableType : null);
    ResolvableType value = (valueTypeDescriptor != null ? valueTypeDescriptor.resolvableType : null);
    return new TypeDescriptor(ResolvableType.forClassWithGenerics(mapType, key, value), null, null);
  }
View Full Code Here

  public static TypeDescriptor forObject(Object source) {
    return (source != null ? valueOf(source.getClass()) : null);
  }

  private static TypeDescriptor nested(TypeDescriptor typeDescriptor, int nestingLevel) {
    ResolvableType nested = typeDescriptor.resolvableType;
    for (int i = 0; i < nestingLevel; i++) {
      if (Object.class.equals(nested.getType())) {
        // Could be a collection type but we don't know about its element type,
        // so let's just assume there is an element type of type Object...
      }
      else {
        nested = nested.getNested(2);
      }
    }
    if (nested == ResolvableType.NONE) {
      return null;
    }
View Full Code Here

  }

  // internal helpers

  private ResolvableType[] getRequiredTypeInfo(Object converter, Class<?> genericIfc) {
    ResolvableType resolvableType = ResolvableType.forClass(converter.getClass()).as(genericIfc);
    ResolvableType[] generics = resolvableType.getGenerics();
    if (generics.length < 2) {
      return null;
    }
    Class<?> sourceType = generics[0].resolve();
    Class<?> targetType = generics[1].resolve();
View Full Code Here

      // Check raw type first...
      if (!this.typeInfo.getTargetType().equals(targetType.getObjectType())) {
        return false;
      }
      // Full check for complex generic type match required?
      ResolvableType rt = targetType.getResolvableType();
      if (!(rt.getType() instanceof Class) && !rt.isAssignableFrom(this.targetType) &&
          !this.targetType.hasUnresolvableGenerics()) {
        return false;
      }
      return !(this.converter instanceof ConditionalConverter) ||
          ((ConditionalConverter) this.converter).matches(sourceType, targetType);
View Full Code Here

TOP

Related Classes of org.springframework.core.ResolvableType

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.