类 TypeDescriptor

java.lang.Object
cn.taketoday.core.TypeDescriptor
所有已实现的接口:
Serializable
直接已知子类:
ObjectToOptionalConverter.GenericTypeDescriptor

public class TypeDescriptor extends Object implements Serializable
Contextual descriptor about a type to convert from or to.

Capable of representing arrays and generic collection types.

从以下版本开始:
3.0 2021/3/22 20:37
作者:
Keith Donald, Andy Clement, Juergen Hoeller, Phillip Webb, Sam Brannen, Stephane Nicoll, Harry Yang
另请参阅:
  • 字段详细资料

  • 构造器详细资料

    • TypeDescriptor

      public TypeDescriptor(Field field)
      Create a new type descriptor from a Field.

      Use this constructor when a source or target conversion point is a field.

      参数:
      field - the field
    • TypeDescriptor

      public TypeDescriptor(ResolvableType resolvableType, @Nullable Class<?> type, @Nullable Annotation[] annotations)
      Create a new type descriptor from a ResolvableType.

      This constructor is used internally and may also be used by subclasses that support non-Java languages with extended type systems.

      参数:
      resolvableType - the resolvable type
      type - the backing type (or null if it should get resolved)
      annotations - the type annotations
    • TypeDescriptor

      public TypeDescriptor(ResolvableType resolvableType, @Nullable Class<?> type, @Nullable AnnotatedElement annotated)
      Create a new type descriptor from a ResolvableType.

      This constructor is used internally and may also be used by subclasses that support non-Java languages with extended type systems.

      参数:
      resolvableType - the resolvable type
      type - the backing type (or null if it should get resolved)
      annotated - annotated-element
      从以下版本开始:
      4.0
    • TypeDescriptor

      public TypeDescriptor(MethodParameter methodParameter)
      Create a new type descriptor from a MethodParameter.

      Use this constructor when a source or target conversion point is a constructor parameter, method parameter, or method return value.

      参数:
      methodParameter - the method parameter
      从以下版本开始:
      4.0
    • TypeDescriptor

      public TypeDescriptor(Property property)
      Create a new type descriptor from a Property.

      Use this constructor when a source or target conversion point is a property on a Java class.

      参数:
      property - the property
  • 方法详细资料

    • getObjectType

      public Class<?> getObjectType()
      Variation of getType() that accounts for a primitive type by returning its object wrapper type.

      This is useful for conversion service implementations that wish to normalize to object-based types and not work with primitive types directly.

    • getType

      public Class<?> getType()
      The type of the backing class, method parameter, field, or property described by this TypeDescriptor.

      Returns primitive types as-is. See getObjectType() for a variation of this operation that resolves primitive types to their corresponding Object types if necessary.

      另请参阅:
    • isArray

      public boolean isArray()
    • isCollection

      public boolean isCollection()
    • getComponentType

      public Class<?> getComponentType()
    • isInstance

      public boolean isInstance(Object source)
    • is

      public boolean is(Class<?> testClass)
    • isAssignableFrom

      public boolean isAssignableFrom(Class<?> subType)
    • isAssignableTo

      public boolean isAssignableTo(Class<?> superType)
    • isEnum

      public boolean isEnum()
    • getName

      public Object getName()
      Return the name of this type: the fully qualified class name.
    • getSimpleName

      public String getSimpleName()
    • getResolvableType

      public ResolvableType getResolvableType()
      Return the underlying ResolvableType.
    • getSource

      public Object getSource()
      Return the underlying source of the descriptor. Will return a Field, Parameter or Type depending on how the TypeDescriptor was constructed. This method is primarily to provide access to additional type information or meta-data that alternative JVM languages may provide.
    • narrow

      public TypeDescriptor narrow(@Nullable Object value)
      Narrows this TypeDescriptor by setting its type to the class of the provided value.

      If the value is null, no narrowing is performed and this TypeDescriptor is returned unchanged.

      Designed to be called by binding frameworks when they read property, field, or method return values. Allows such frameworks to narrow a TypeDescriptor built from a declared property, field, or method return value type. For example, a field declared as java.lang.Object would be narrowed to java.util.HashMap if it was set to a java.util.HashMap value. The narrowed TypeDescriptor can then be used to convert the HashMap to some other type. Annotation and nested type context is preserved by the narrowed copy.

      参数:
      value - the value to use for narrowing this type descriptor
      返回:
      this TypeDescriptor narrowed (returns a copy with its type updated to the class of the provided value)
    • upcast

      @Nullable public TypeDescriptor upcast(@Nullable Class<?> superType)
      Cast this TypeDescriptor to a superclass or implemented interface preserving annotations and nested type context.
      参数:
      superType - the super type to cast to (can be null)
      返回:
      a new TypeDescriptor for the up-cast type
      抛出:
      IllegalArgumentException - if this type is not assignable to the super-type
    • isPrimitive

      public boolean isPrimitive()
      Is this type a primitive type?
    • getAnnotations

      public Annotation[] getAnnotations()
      Return the annotations associated with this type descriptor, if any.
      返回:
      the annotations, or an empty array if none
    • getAnnotatedElement

      public AnnotatedElement getAnnotatedElement()
      for internal using
    • hasAnnotation

      public boolean hasAnnotation(Class<? extends Annotation> annotationType)
      Determine if this type descriptor has the specified annotation.

      this method supports arbitrary levels of meta-annotations.

      参数:
      annotationType - the annotation type
      返回:
      true if the annotation is present
    • getAnnotation

      @Nullable public <T extends Annotation> T getAnnotation(Class<T> annotationType)
      Obtain the annotation of the specified annotationType that is on this type descriptor.

      This method supports arbitrary levels of meta-annotations.

      参数:
      annotationType - the annotation type
      返回:
      the annotation, or null if no such annotation exists on this type descriptor
    • isAssignableTo

      public boolean isAssignableTo(TypeDescriptor typeDescriptor)
      Returns true if an object of this type descriptor can be assigned to the location described by the given type descriptor.

      For example, valueOf(String.class).isAssignableTo(valueOf(CharSequence.class)) returns true because a String value can be assigned to a CharSequence variable. On the other hand, valueOf(Number.class).isAssignableTo(valueOf(Integer.class)) returns false because, while all Integers are Numbers, not all Numbers are Integers.

      For arrays, collections, and maps, element and key/value types are checked if declared. For example, a List<String> field value is assignable to a Collection<CharSequence> field, but List<Number> is not assignable to List<Integer>.

      返回:
      true if this type is assignable to the type represented by the provided type descriptor
    • isNestedAssignable

      private boolean isNestedAssignable(@Nullable TypeDescriptor nestedTypeDescriptor, @Nullable TypeDescriptor otherNestedTypeDescriptor)
    • getElementDescriptor

      @Nullable public TypeDescriptor getElementDescriptor()
      If this type is an array, returns the array's component type. If this type is a Stream, returns the stream's component type. If this type is a Collection and it is parameterized, returns the Collection's element type. If the Collection is not parameterized, returns null indicating the element type is not declared.
      返回:
      the array component type or Collection element type, or null if this type is not an array type or a java.util.Collection or if its element type is not parameterized
      另请参阅:
    • elementDescriptor

      @Nullable public TypeDescriptor elementDescriptor(Object element)
      If this type is a Collection or an array, creates a element TypeDescriptor from the provided collection or array element.

      Narrows the elementType property to the class of the provided collection or array element. For example, if this describes a java.util.List&lt;java.lang.Number&lt; and the element argument is an java.lang.Integer, the returned TypeDescriptor will be java.lang.Integer. If this describes a java.util.List&lt;?&gt; and the element argument is an java.lang.Integer, the returned TypeDescriptor will be java.lang.Integer as well.

      Annotation and nested type context will be preserved in the narrowed TypeDescriptor that is returned.

      参数:
      element - the collection or array element
      返回:
      a element type descriptor, narrowed to the type of the provided element
      另请参阅:
    • isMap

      public boolean isMap()
      Is this type a Map type?
    • getMapKeyDescriptor

      @Nullable public TypeDescriptor getMapKeyDescriptor()
      If this type is a Map and its key type is parameterized, returns the map's key type. If the Map's key type is not parameterized, returns null indicating the key type is not declared.
      返回:
      the Map key type, or null if this type is a Map but its key type is not parameterized
      抛出:
      IllegalStateException - if this type is not a java.util.Map
    • getMapKeyDescriptor

      @Nullable public TypeDescriptor getMapKeyDescriptor(Object mapKey)
      If this type is a Map, creates a mapKey TypeDescriptor from the provided map key.

      Narrows the mapKeyType property to the class of the provided map key. For example, if this describes a java.util.Map&lt;java.lang.Number, java.lang.String&lt; and the key argument is a java.lang.Integer, the returned TypeDescriptor will be java.lang.Integer. If this describes a java.util.Map&lt;?, ?&gt; and the key argument is a java.lang.Integer, the returned TypeDescriptor will be java.lang.Integer as well.

      Annotation and nested type context will be preserved in the narrowed TypeDescriptor that is returned.

      参数:
      mapKey - the map key
      返回:
      the map key type descriptor
      抛出:
      IllegalStateException - if this type is not a java.util.Map
      另请参阅:
    • getMapValueDescriptor

      @Nullable public TypeDescriptor getMapValueDescriptor()
      If this type is a Map and its value type is parameterized, returns the map's value type.

      If the Map's value type is not parameterized, returns null indicating the value type is not declared.

      返回:
      the Map value type, or null if this type is a Map but its value type is not parameterized
      抛出:
      IllegalStateException - if this type is not a java.util.Map
    • getMapValueDescriptor

      @Nullable public TypeDescriptor getMapValueDescriptor(Object mapValue)
      If this type is a Map, creates a mapValue TypeDescriptor from the provided map value.

      Narrows the mapValueType property to the class of the provided map value. For example, if this describes a java.util.Map&lt;java.lang.String, java.lang.Number&lt; and the value argument is a java.lang.Integer, the returned TypeDescriptor will be java.lang.Integer. If this describes a java.util.Map&lt;?, ?&gt; and the value argument is a java.lang.Integer, the returned TypeDescriptor will be java.lang.Integer as well.

      Annotation and nested type context will be preserved in the narrowed TypeDescriptor that is returned.

      参数:
      mapValue - the map value
      返回:
      the map value type descriptor
      抛出:
      IllegalStateException - if this type is not a java.util.Map
      另请参阅:
    • narrow

      @Nullable private TypeDescriptor narrow(@Nullable Object value, @Nullable TypeDescriptor typeDescriptor)
    • equals

      public boolean equals(Object other)
      覆盖:
      equals 在类中 Object
    • annotationsMatch

      private boolean annotationsMatch(TypeDescriptor otherDesc)
    • annotationEquals

      private boolean annotationEquals(Annotation ann, Annotation otherAnn)
    • hashCode

      public int hashCode()
      覆盖:
      hashCode 在类中 Object
    • toString

      public String toString()
      覆盖:
      toString 在类中 Object
    • forObject

      @Nullable public static TypeDescriptor forObject(@Nullable Object source)
      Create a new type descriptor for an object.

      Use this factory method to introspect a source object before asking the conversion system to convert it to some another type.

      If the provided object is null, returns null, else calls valueOf(Class) to build a TypeDescriptor from the object's class.

      参数:
      source - the source object
      返回:
      the type descriptor
    • valueOf

      public static TypeDescriptor valueOf(@Nullable Class<?> type)
      Create a new type descriptor from the given type.

      Use this to instruct the conversion system to convert an object to a specific target type, when no type location such as a method parameter or field is available to provide additional conversion context.

      Generally prefer use of forObject(Object) for constructing type descriptors from source objects, as it handles the null object case.

      参数:
      type - the class (may be null to indicate Object.class)
      返回:
      the corresponding type descriptor
    • collection

      public static TypeDescriptor collection(Class<?> collectionType, Class<?> element)
    • collection

      public static TypeDescriptor collection(Class<?> collectionType, @Nullable TypeDescriptor elementDescriptor)
      Create a new type descriptor from a Collection type.

      Useful for converting to typed Collections.

      For example, a List<String> could be converted to a List<EmailAddress> by converting to a targetType built with this method. The method call to construct such a TypeDescriptor would look something like: collection(List.class, TypeDescriptor.valueOf(EmailAddress.class));

      参数:
      collectionType - the collection type, which must implement Collection.
      elementDescriptor - a descriptor for the collection's element type, used to convert collection elements
      返回:
      the collection type descriptor
    • map

      public static TypeDescriptor map(Class<?> mapType, Class<?> key, Class<?> value)
    • map

      public static TypeDescriptor map(Class<?> mapType, @Nullable TypeDescriptor keyDescriptor, @Nullable TypeDescriptor valueDescriptor)
      Create a new type descriptor from a Map type.

      Useful for converting to typed Maps.

      For example, a Map<String, String> could be converted to a Map<Id, EmailAddress> by converting to a targetType built with this method: The method call to construct such a TypeDescriptor would look something like:

       map(Map.class, TypeDescriptor.valueOf(Id.class), TypeDescriptor.valueOf(EmailAddress.class));
       
      参数:
      mapType - the map type, which must implement Map
      keyDescriptor - a descriptor for the map's key type, used to convert map keys
      valueDescriptor - the map's value type, used to convert map values
      返回:
      the map type descriptor
    • array

      @Nullable public static TypeDescriptor array(@Nullable TypeDescriptor elementDescriptor)
      Create a new type descriptor as an array of the specified type.

      For example to create a Map<String,String>[] use:

       TypeDescriptor.array(TypeDescriptor.map(Map.class, TypeDescriptor.value(String.class), TypeDescriptor.value(String.class)));
       
      参数:
      elementDescriptor - the TypeDescriptor of the array element or null
      返回:
      an array TypeDescriptor or null if elementDescriptor is null
    • nested

      @Nullable public static TypeDescriptor nested(Field field, int nestingLevel)
      Create a type descriptor for a nested type declared within the field.

      For example, if the field is a List<String> and the nesting level is 1, the nested type descriptor will be String.class.

      If the field is a List<List<String>> and the nesting level is 2, the nested type descriptor will also be a String.class.

      If the field is a Map<Integer, String> and the nesting level is 1, the nested type descriptor will be String, derived from the map value.

      If the field is a List<Map<Integer, String>> and the nesting level is 2, the nested type descriptor will be String, derived from the map value.

      Returns null if a nested type cannot be obtained because it was not declared. For example, if the field is a List<?>, the nested type descriptor returned will be null.

      参数:
      field - the field
      nestingLevel - the nesting level of the collection/array element or map key/value declaration within the field
      返回:
      the nested type descriptor at the specified nesting level, or null if it could not be obtained
      抛出:
      IllegalArgumentException - if the types up to the specified nesting level are not of collection, array, or map types
    • nested

      @Nullable public static TypeDescriptor nested(MethodParameter methodParameter, int nestingLevel)
      Create a type descriptor for a nested type declared within the method parameter.

      For example, if the methodParameter is a List<String> and the nesting level is 1, the nested type descriptor will be String.class.

      If the methodParameter is a List<List<String>> and the nesting level is 2, the nested type descriptor will also be a String.class.

      If the methodParameter is a Map<Integer, String> and the nesting level is 1, the nested type descriptor will be String, derived from the map value.

      If the methodParameter is a List<Map<Integer, String>> and the nesting level is 2, the nested type descriptor will be String, derived from the map value.

      Returns null if a nested type cannot be obtained because it was not declared. For example, if the method parameter is a List<?>, the nested type descriptor returned will be null.

      参数:
      methodParameter - the method parameter with a nestingLevel of 1
      nestingLevel - the nesting level of the collection/array element or map key/value declaration within the method parameter
      返回:
      the nested type descriptor at the specified nesting level, or null if it could not be obtained
      抛出:
      IllegalArgumentException - if the nesting level of the input MethodParameter argument is not 1, or if the types up to the specified nesting level are not of collection, array, or map types
      从以下版本开始:
      4.0
    • nested

      @Nullable public static TypeDescriptor nested(TypeDescriptor typeDescriptor, int nestingLevel)
    • getRelatedIfResolvable

      @Nullable private static TypeDescriptor getRelatedIfResolvable(TypeDescriptor source, ResolvableType type)
    • forParameter

      public static TypeDescriptor forParameter(Executable executable, int parameterIndex)
    • fromParameter

      public static TypeDescriptor fromParameter(Parameter parameter)
      从以下版本开始:
      3.0.2