- java.lang.Object
-
- io.leangen.geantyref.TypeFactory
-
public class TypeFactory extends java.lang.Object
Utility class for creating instances ofType
. These types can be used with theGenericTypeReflector
or anything else handling Java types.
-
-
Field Summary
Fields Modifier and Type Field Description private static java.lang.reflect.WildcardType
UNBOUND_WILDCARD
-
Constructor Summary
Constructors Constructor Description TypeFactory()
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description static java.lang.reflect.AnnotatedType
annotatedClass(java.lang.Class<?> clazz, java.lang.annotation.Annotation[] annotations)
static java.lang.reflect.AnnotatedType
annotatedInnerClass(java.lang.reflect.Type owner, java.lang.Class<?> clazz, java.lang.annotation.Annotation[] annotations)
static <A extends java.lang.annotation.Annotation>
Aannotation(java.lang.Class<A> annotationType, java.util.Map<java.lang.String,java.lang.Object> values)
Creates an instance of an annotation.static java.lang.reflect.AnnotatedArrayType
arrayOf(java.lang.reflect.AnnotatedType componentType, java.lang.annotation.Annotation[] annotations)
Creates anAnnotatedArrayType
wrapped around an array types created byarrayOf(Type)
static java.lang.reflect.Type
arrayOf(java.lang.reflect.Type componentType)
Creates a array type.private static void
checkParametersWithinBound(java.lang.reflect.ParameterizedType type)
Check if the type arguments of the given type are within the bounds declared on the type parameters.private static boolean
couldHaveCommonSubtype(java.lang.reflect.Type type1, java.lang.reflect.Type type2)
Checks if the intersection of two types is not empty.static java.lang.reflect.Type
innerClass(java.lang.reflect.Type owner, java.lang.Class<?> clazz)
Creates a type ofclazz
nested inowner
.static java.lang.reflect.AnnotatedType
parameterizedAnnotatedClass(java.lang.Class<?> clazz, java.lang.annotation.Annotation[] annotations, java.lang.reflect.AnnotatedType... arguments)
static java.lang.reflect.AnnotatedType
parameterizedAnnotatedInnerClass(java.lang.reflect.AnnotatedType owner, java.lang.Class<?> clazz, java.lang.annotation.Annotation[] annotations, java.lang.reflect.AnnotatedType... arguments)
static java.lang.reflect.AnnotatedType
parameterizedAnnotatedInnerClass(java.lang.reflect.Type owner, java.lang.Class<?> clazz, java.lang.annotation.Annotation[] annotations, java.lang.reflect.AnnotatedType... arguments)
static java.lang.reflect.AnnotatedParameterizedType
parameterizedAnnotatedType(java.lang.reflect.ParameterizedType type, java.lang.annotation.Annotation[] typeAnnotations, java.lang.annotation.Annotation[]... argumentAnnotations)
static java.lang.reflect.Type
parameterizedClass(java.lang.Class<?> clazz, java.lang.reflect.Type... arguments)
Creates a type of classclazz
witharguments
as type arguments.static java.lang.reflect.Type
parameterizedInnerClass(java.lang.reflect.Type owner, java.lang.Class<?> clazz, java.lang.reflect.Type... arguments)
Creates a type ofclazz
witharguments
as type arguments, nested inowner
.private static java.lang.reflect.Type
transformOwner(java.lang.reflect.Type givenOwner, java.lang.Class<?> clazz)
Transforms the given owner type into an appropriate one when constructing a parameterized type.static java.lang.reflect.WildcardType
unboundWildcard()
Returns the wildcard type without bounds.static java.lang.reflect.WildcardType
wildcardExtends(java.lang.reflect.Type upperBound)
Creates a wildcard type with an upper bound.static java.lang.reflect.WildcardType
wildcardSuper(java.lang.reflect.Type lowerBound)
Creates a wildcard type with a lower bound.
-
-
-
Method Detail
-
parameterizedClass
public static java.lang.reflect.Type parameterizedClass(java.lang.Class<?> clazz, java.lang.reflect.Type... arguments)
Creates a type of classclazz
witharguments
as type arguments.For example:
parameterizedClass(Map.class, Integer.class, String.class)
returns the typeMap<Integer, String>
.- Parameters:
clazz
- Type class of the type to createarguments
- Type arguments for the variables ofclazz
, or null if these are not known.- Returns:
- A
ParameterizedType
, or simplyclazz
ifarguments
isnull
or empty.
-
annotatedClass
public static java.lang.reflect.AnnotatedType annotatedClass(java.lang.Class<?> clazz, java.lang.annotation.Annotation[] annotations)
-
parameterizedAnnotatedClass
public static java.lang.reflect.AnnotatedType parameterizedAnnotatedClass(java.lang.Class<?> clazz, java.lang.annotation.Annotation[] annotations, java.lang.reflect.AnnotatedType... arguments)
-
annotatedInnerClass
public static java.lang.reflect.AnnotatedType annotatedInnerClass(java.lang.reflect.Type owner, java.lang.Class<?> clazz, java.lang.annotation.Annotation[] annotations)
-
parameterizedAnnotatedInnerClass
public static java.lang.reflect.AnnotatedType parameterizedAnnotatedInnerClass(java.lang.reflect.Type owner, java.lang.Class<?> clazz, java.lang.annotation.Annotation[] annotations, java.lang.reflect.AnnotatedType... arguments)
-
parameterizedAnnotatedInnerClass
public static java.lang.reflect.AnnotatedType parameterizedAnnotatedInnerClass(java.lang.reflect.AnnotatedType owner, java.lang.Class<?> clazz, java.lang.annotation.Annotation[] annotations, java.lang.reflect.AnnotatedType... arguments)
-
parameterizedAnnotatedType
public static java.lang.reflect.AnnotatedParameterizedType parameterizedAnnotatedType(java.lang.reflect.ParameterizedType type, java.lang.annotation.Annotation[] typeAnnotations, java.lang.annotation.Annotation[]... argumentAnnotations)
-
innerClass
public static java.lang.reflect.Type innerClass(java.lang.reflect.Type owner, java.lang.Class<?> clazz)
Creates a type ofclazz
nested inowner
.- Parameters:
owner
- The owner type. This should be a subtype ofclazz.getDeclaringClass()
, ornull
if no owner is known.clazz
- Type class of the type to create- Returns:
- A
ParameterizedType
if the class declaringclazz
is generic and its type parameters are known inowner
andclazz
itself has no type parameters. Otherwise, just returnsclazz
.
-
parameterizedInnerClass
public static java.lang.reflect.Type parameterizedInnerClass(java.lang.reflect.Type owner, java.lang.Class<?> clazz, java.lang.reflect.Type... arguments)
Creates a type ofclazz
witharguments
as type arguments, nested inowner
.In the ideal case, this returns a
ParameterizedType
with all generic information in it. If some type arguments are missing or if the resulting type simply doesn't need any type parameters, it returns the rawclazz
. Note that types with some parameters specified and others not, don't exist in Java.If the caller does not know the exact
owner
type orarguments
,null
should be given (orparameterizedClass(Class, Type...)
orinnerClass(Type, Class)
could be used). If they are not needed (non-generic owner and/orclazz
has no type parameters), they will be filled in automatically. If they are needed but are not given, the rawclazz
is returned.The specified
owner
may be any subtype ofclazz.getDeclaringClass()
. It is automatically converted into the right parameterized version of the declaring class. Ifclazz
is astatic
(nested) class, the owner is not used.- Parameters:
owner
- The owner type. This should be a subtype ofclazz.getDeclaringClass()
, ornull
if no owner is known.clazz
- Type class of the type to createarguments
- Type arguments for the variables ofclazz
, or null if these are not known.- Returns:
- A
ParameterizedType
ifclazz
or the class declaringclazz
is generic, and all the needed type arguments are specified inowner
andarguments
. Otherwise, just returnsclazz
. - Throws:
java.lang.IllegalArgumentException
- ifarguments
(is non-null and) has an incorrect length, or if one of thearguments
is not within the bounds declared on the matching type variable, or if owner is non-null butclazz
has no declaring class (e.g. is a top-level class), or if owner is not a a subtype ofclazz.getDeclaringClass()
.java.lang.NullPointerException
- ifclazz
or one of the elements inarguments
is null.
-
checkParametersWithinBound
private static void checkParametersWithinBound(java.lang.reflect.ParameterizedType type)
Check if the type arguments of the given type are within the bounds declared on the type parameters. Only the type arguments of the type itself are checked, the possible owner type is assumed to be valid.It does not follow the checks defined in the JLS because there are several problems with those (see http://stackoverflow.com/questions/7003009 for one). Instead, this applies some intuition and follows what Java compilers seem to do.
- Parameters:
type
- possibly inconsistent type to check.- Throws:
java.lang.IllegalArgumentException
- if the type arguments are not within the bounds
-
couldHaveCommonSubtype
private static boolean couldHaveCommonSubtype(java.lang.reflect.Type type1, java.lang.reflect.Type type2)
Checks if the intersection of two types is not empty.
-
transformOwner
private static java.lang.reflect.Type transformOwner(java.lang.reflect.Type givenOwner, java.lang.Class<?> clazz)
Transforms the given owner type into an appropriate one when constructing a parameterized type.
-
unboundWildcard
public static java.lang.reflect.WildcardType unboundWildcard()
Returns the wildcard type without bounds. This is the '?
' in for exampleList<?>
.- Returns:
- The unbound wildcard type
-
wildcardExtends
public static java.lang.reflect.WildcardType wildcardExtends(java.lang.reflect.Type upperBound)
Creates a wildcard type with an upper bound.For example
wildcardExtends(String.class)
returns the type? extends String
.- Parameters:
upperBound
- Upper bound of the wildcard- Returns:
- A wildcard type
-
wildcardSuper
public static java.lang.reflect.WildcardType wildcardSuper(java.lang.reflect.Type lowerBound)
Creates a wildcard type with a lower bound.For example
wildcardSuper(String.class)
returns the type? super String
.- Parameters:
lowerBound
- Lower bound of the wildcard- Returns:
- A wildcard type
-
arrayOf
public static java.lang.reflect.Type arrayOf(java.lang.reflect.Type componentType)
Creates a array type.If
componentType
is not a generic type but aClass
object, this returns theClass
representing the non-generic array type. Otherwise, returns aGenericArrayType
.For example:
arrayOf(String.class)
returnsString[].class
arrayOf(parameterizedClass(List.class, String.class))
returns theGenericArrayType
forList<String>[]
- Parameters:
componentType
- The type of the components of the array.- Returns:
- An array type.
-
arrayOf
public static java.lang.reflect.AnnotatedArrayType arrayOf(java.lang.reflect.AnnotatedType componentType, java.lang.annotation.Annotation[] annotations)
Creates anAnnotatedArrayType
wrapped around an array types created byarrayOf(Type)
- Parameters:
componentType
- The type of the components of the array.annotations
- The annotations to be added to the array type itself.- Returns:
- An array type.
-
annotation
public static <A extends java.lang.annotation.Annotation> A annotation(java.lang.Class<A> annotationType, java.util.Map<java.lang.String,java.lang.Object> values) throws AnnotationFormatException
Creates an instance of an annotation.- Type Parameters:
A
- The type of the annotation.- Parameters:
annotationType
- TheClass
representing the type of the annotation to be created.values
- A map of values to be assigned to the annotation elements.- Returns:
- An
Annotation
instanceof matchingannotationType
- Throws:
AnnotationFormatException
- Thrown if incomplete or invalidvalues
are provided
-
-