public class TypeDescriptor
extends java.lang.Object
Modifier and Type | Field and Description |
---|---|
private java.lang.annotation.Annotation[] |
annotations |
private TypeDescriptor |
elementTypeDescriptor |
(package private) static java.lang.annotation.Annotation[] |
EMPTY_ANNOTATION_ARRAY |
private TypeDescriptor |
mapKeyTypeDescriptor |
private TypeDescriptor |
mapValueTypeDescriptor |
private java.lang.Class<?> |
type |
private static java.util.Map<java.lang.Class<?>,TypeDescriptor> |
typeDescriptorCache |
Modifier | Constructor and Description |
---|---|
(package private) |
TypeDescriptor(AbstractDescriptor descriptor) |
private |
TypeDescriptor(java.lang.Class<?> type) |
private |
TypeDescriptor(java.lang.Class<?> collectionType,
TypeDescriptor elementTypeDescriptor) |
private |
TypeDescriptor(java.lang.Class<?> mapType,
TypeDescriptor keyTypeDescriptor,
TypeDescriptor valueTypeDescriptor) |
private |
TypeDescriptor(java.lang.Class<?> type,
TypeDescriptor elementTypeDescriptor,
TypeDescriptor mapKeyTypeDescriptor,
TypeDescriptor mapValueTypeDescriptor,
java.lang.annotation.Annotation[] annotations) |
|
TypeDescriptor(java.lang.reflect.Field field)
Create a new type descriptor from a
Field . |
|
TypeDescriptor(MethodParameter methodParameter)
Create a new type descriptor from a
MethodParameter . |
|
TypeDescriptor(Property property)
Create a new type descriptor from a
Property . |
Modifier and Type | Method and Description |
---|---|
static TypeDescriptor |
array(TypeDescriptor elementTypeDescriptor)
Create a new type descriptor as an array of the specified type.
|
private void |
assertCollectionOrArray() |
private void |
assertMap() |
static TypeDescriptor |
collection(java.lang.Class<?> collectionType,
TypeDescriptor elementTypeDescriptor)
Create a new type descriptor from a
Collection type. |
TypeDescriptor |
elementTypeDescriptor(java.lang.Object element)
If this type is a
Collection or an Array, creates a element TypeDescriptor from the provided collection or array element. |
boolean |
equals(java.lang.Object obj) |
static TypeDescriptor |
forObject(java.lang.Object source)
Create a new type descriptor for an object.
|
<T extends java.lang.annotation.Annotation> |
getAnnotation(java.lang.Class<T> annotationType)
Obtain the annotation associated with this type descriptor of the specified type.
|
java.lang.annotation.Annotation[] |
getAnnotations()
The annotations associated with this type descriptor, if any.
|
java.lang.Class<?> |
getElementType()
Deprecated.
in Spring 3.1 in favor of
getElementTypeDescriptor() |
TypeDescriptor |
getElementTypeDescriptor()
If this type is an array, returns the array's component type.
|
java.lang.Class<?> |
getMapKeyType()
Deprecated.
in Spring 3.1 in favor of
getMapKeyTypeDescriptor() |
TypeDescriptor |
getMapKeyTypeDescriptor()
If this type is a
Map and its key type is parameterized, returns the map's key type. |
TypeDescriptor |
getMapKeyTypeDescriptor(java.lang.Object mapKey)
If this type is a
Map , creates a mapKey TypeDescriptor from the provided map key. |
java.lang.Class<?> |
getMapValueType()
Deprecated.
in Spring 3.1 in favor of
getMapValueTypeDescriptor() |
TypeDescriptor |
getMapValueTypeDescriptor()
If this type is a
Map and its value type is parameterized, returns the map's value type. |
TypeDescriptor |
getMapValueTypeDescriptor(java.lang.Object mapValue)
If this type is a
Map , creates a mapValue TypeDescriptor from the provided map value. |
java.lang.String |
getName()
Returns the name of this type: the fully qualified class name.
|
java.lang.Class<?> |
getObjectType()
Variation of
getType() that accounts for a primitive type by returning its object wrapper type. |
java.lang.Class<?> |
getType()
The type of the backing class, method parameter, field, or property described by this TypeDescriptor.
|
boolean |
hasAnnotation(java.lang.Class<? extends java.lang.annotation.Annotation> annotationType)
Determine if this type descriptor has the specified annotation.
|
int |
hashCode() |
boolean |
isArray()
Is this type an array type?
|
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.
|
boolean |
isCollection()
Is this type a
Collection type? |
boolean |
isMap()
Is this type a
Map type? |
private boolean |
isNestedAssignable(TypeDescriptor nestedTypeDescriptor,
TypeDescriptor otherNestedTypeDescriptor) |
boolean |
isPrimitive()
Is this type a primitive type?
|
static TypeDescriptor |
map(java.lang.Class<?> mapType,
TypeDescriptor keyTypeDescriptor,
TypeDescriptor valueTypeDescriptor)
Create a new type descriptor from a
Map type. |
TypeDescriptor |
narrow(java.lang.Object value)
Narrows this
TypeDescriptor by setting its type to the class of the provided value. |
private TypeDescriptor |
narrow(java.lang.Object value,
TypeDescriptor typeDescriptor) |
private static TypeDescriptor |
nested(AbstractDescriptor descriptor,
int nestingLevel) |
static TypeDescriptor |
nested(java.lang.reflect.Field field,
int nestingLevel)
Creates a type descriptor for a nested type declared within the field.
|
static TypeDescriptor |
nested(MethodParameter methodParameter,
int nestingLevel)
Creates a type descriptor for a nested type declared within the method parameter.
|
static TypeDescriptor |
nested(Property property,
int nestingLevel)
Creates a type descriptor for a nested type declared within the property.
|
(package private) static java.lang.annotation.Annotation[] |
nullSafeAnnotations(java.lang.annotation.Annotation[] annotations) |
java.lang.String |
toString() |
TypeDescriptor |
upcast(java.lang.Class<?> superType)
Cast this
TypeDescriptor to a superclass or implemented interface
preserving annotations and nested type context. |
static TypeDescriptor |
valueOf(java.lang.Class<?> type)
Create a new type descriptor from the given type.
|
private java.lang.String |
wildcard(TypeDescriptor typeDescriptor) |
static final java.lang.annotation.Annotation[] EMPTY_ANNOTATION_ARRAY
private static final java.util.Map<java.lang.Class<?>,TypeDescriptor> typeDescriptorCache
private final java.lang.Class<?> type
private final TypeDescriptor elementTypeDescriptor
private final TypeDescriptor mapKeyTypeDescriptor
private final TypeDescriptor mapValueTypeDescriptor
private final java.lang.annotation.Annotation[] annotations
public TypeDescriptor(MethodParameter methodParameter)
MethodParameter
.
Use this constructor when a source or target conversion point is a constructor parameter, method parameter, or method return value.
methodParameter
- the method parameterpublic TypeDescriptor(java.lang.reflect.Field field)
Field
.
Use this constructor when a source or target conversion point is a field.
field
- the fieldpublic TypeDescriptor(Property property)
Property
.
Use this constructor when a source or target conversion point is a property on a Java class.
property
- the propertyTypeDescriptor(AbstractDescriptor descriptor)
private TypeDescriptor(java.lang.Class<?> type)
private TypeDescriptor(java.lang.Class<?> collectionType, TypeDescriptor elementTypeDescriptor)
private TypeDescriptor(java.lang.Class<?> mapType, TypeDescriptor keyTypeDescriptor, TypeDescriptor valueTypeDescriptor)
private TypeDescriptor(java.lang.Class<?> type, TypeDescriptor elementTypeDescriptor, TypeDescriptor mapKeyTypeDescriptor, TypeDescriptor mapValueTypeDescriptor, java.lang.annotation.Annotation[] annotations)
public static TypeDescriptor valueOf(java.lang.Class<?> 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 classpublic static TypeDescriptor collection(java.lang.Class<?> collectionType, TypeDescriptor elementTypeDescriptor)
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
.elementTypeDescriptor
- a descriptor for the collection's element type,
used to convert collection elementspublic static TypeDescriptor map(java.lang.Class<?> mapType, TypeDescriptor keyTypeDescriptor, TypeDescriptor valueTypeDescriptor)
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
keyTypeDescriptor
- a descriptor for the map's key type, used to convert map keysvalueTypeDescriptor
- the map's value type, used to convert map valuespublic static TypeDescriptor array(TypeDescriptor elementTypeDescriptor)
For example to create a Map<String,String>[]
use
TypeDescriptor.array(TypeDescriptor.map(Map.class, TypeDescriptor.value(String.class), TypeDescriptor.value(String.class)))
.
elementTypeDescriptor
- the TypeDescriptor
of the array element or null
TypeDescriptor
or null
if elementTypeDescriptor
is null
public static TypeDescriptor nested(MethodParameter methodParameter, int nestingLevel)
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 1nestingLevel
- the nesting level of the collection/array element or
map key/value declaration within the method parameterjava.lang.IllegalArgumentException
- if the nesting level of the input
MethodParameter
argument is not 1java.lang.IllegalArgumentException
- if the types up to the specified nesting
level are not of collection, array, or map typespublic static TypeDescriptor nested(java.lang.reflect.Field field, int nestingLevel)
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 fieldnestingLevel
- the nesting level of the collection/array element or
map key/value declaration within the fieldjava.lang.IllegalArgumentException
- if the types up to the specified nesting
level are not of collection, array, or map typespublic static TypeDescriptor nested(Property property, int nestingLevel)
For example, if the property is a List<String>
and the nesting
level is 1, the nested type descriptor will be String.class
.
If the property is a List<List<String>>
and the nesting level
is 2, the nested type descriptor will also be a String.class
.
If the property 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 property 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 property is a List<?>
, the nested type descriptor
returned will be null
.
property
- the propertynestingLevel
- the nesting level of the collection/array element or
map key/value declaration within the propertynull
if it could not be obtainedjava.lang.IllegalArgumentException
- if the types up to the specified nesting
level are not of collection, array, or map typespublic static TypeDescriptor forObject(java.lang.Object source)
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 objectpublic java.lang.Class<?> getType()
Returns primitive types as-is.
See getObjectType()
for a variation of this operation that resolves primitive types
to their corresponding Object types if necessary.
null
getObjectType()
public java.lang.Class<?> getObjectType()
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.
public TypeDescriptor narrow(java.lang.Object value)
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 descriptorpublic TypeDescriptor upcast(java.lang.Class<?> superType)
TypeDescriptor
to a superclass or implemented interface
preserving annotations and nested type context.superType
- the super type to cast to (can be null
java.lang.IllegalArgumentException
- if this type is not assignable to the super-typepublic java.lang.String getName()
public boolean isPrimitive()
public java.lang.annotation.Annotation[] getAnnotations()
public boolean hasAnnotation(java.lang.Class<? extends java.lang.annotation.Annotation> annotationType)
annotationType
- the annotation typepublic <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T> annotationType)
annotationType
- the annotation typenull
if no such annotation exists on this type descriptorpublic boolean isAssignableTo(TypeDescriptor typeDescriptor)
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>.
getObjectType()
public boolean isCollection()
Collection
type?public boolean isArray()
public TypeDescriptor getElementTypeDescriptor()
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.null
if this type is a Collection but its element type is not parameterizedjava.lang.IllegalStateException
- if this type is not a java.util.Collection or Array typepublic TypeDescriptor elementTypeDescriptor(java.lang.Object element)
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<java.lang.Number< and the element argument is a java.lang.Integer, the returned TypeDescriptor will be java.lang.Integer.
If this describes a java.util.List<?> and the element 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.
element
- the collection or array elementjava.lang.IllegalStateException
- if this type is not a java.util.Collection or Array typenarrow(Object)
public boolean isMap()
Map
type?public TypeDescriptor getMapKeyTypeDescriptor()
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.null
if this type is a Map but its key type is not parameterizedjava.lang.IllegalStateException
- if this type is not a java.util.Mappublic TypeDescriptor getMapKeyTypeDescriptor(java.lang.Object mapKey)
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<java.lang.Number, java.lang.String< and the key argument is a java.lang.Integer, the returned TypeDescriptor will be java.lang.Integer.
If this describes a java.util.Map<?, ?> 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 keyjava.lang.IllegalStateException
- if this type is not a java.util.Mapnarrow(Object)
public TypeDescriptor getMapValueTypeDescriptor()
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.
null
if this type is a Map but its value type is not parameterizedjava.lang.IllegalStateException
- if this type is not a java.util.Mappublic TypeDescriptor getMapValueTypeDescriptor(java.lang.Object mapValue)
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<java.lang.String, java.lang.Number< and the value argument is a java.lang.Integer, the returned TypeDescriptor will be java.lang.Integer.
If this describes a java.util.Map<?, ?> 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 valuejava.lang.IllegalStateException
- if this type is not a java.util.Map@Deprecated public java.lang.Class<?> getElementType()
getElementTypeDescriptor()
getType()
for the elementTypeDescriptor
.java.lang.IllegalStateException
- if this type is not a java.util.Collection or Array type@Deprecated public java.lang.Class<?> getMapKeyType()
getMapKeyTypeDescriptor()
getType()
for the getMapKeyTypeDescriptor
.java.lang.IllegalStateException
- if this type is not a java.util.Map@Deprecated public java.lang.Class<?> getMapValueType()
getMapValueTypeDescriptor()
getType()
for the getMapValueTypeDescriptor
.java.lang.IllegalStateException
- if this type is not a java.util.Mapstatic java.lang.annotation.Annotation[] nullSafeAnnotations(java.lang.annotation.Annotation[] annotations)
private static TypeDescriptor nested(AbstractDescriptor descriptor, int nestingLevel)
private void assertCollectionOrArray()
private void assertMap()
private TypeDescriptor narrow(java.lang.Object value, TypeDescriptor typeDescriptor)
private boolean isNestedAssignable(TypeDescriptor nestedTypeDescriptor, TypeDescriptor otherNestedTypeDescriptor)
private java.lang.String wildcard(TypeDescriptor typeDescriptor)
public boolean equals(java.lang.Object obj)
equals
in class java.lang.Object
public int hashCode()
hashCode
in class java.lang.Object
public java.lang.String toString()
toString
in class java.lang.Object