Class TypeFactory

java.lang.Object
io.leangen.geantyref.TypeFactory

public class TypeFactory extends Object
Utility class for creating instances of Type. These types can be used with the GenericTypeReflector or anything else handling Java types.
  • Field Details

    • UNBOUND_WILDCARD

      private static final WildcardType UNBOUND_WILDCARD
  • Constructor Details

    • TypeFactory

      public TypeFactory()
  • Method Details

    • parameterizedClass

      public static Type parameterizedClass(Class<?> clazz, Type... arguments)
      Creates a type of class clazz with arguments as type arguments.

      For example: parameterizedClass(Map.class, Integer.class, String.class) returns the type Map<Integer, String>.

      Parameters:
      clazz - Type class of the type to create
      arguments - Type arguments for the variables of clazz, or null if these are not known.
      Returns:
      A ParameterizedType, or simply clazz if arguments is null or empty.
    • annotatedClass

      public static AnnotatedType annotatedClass(Class<?> clazz, Annotation[] annotations)
    • parameterizedAnnotatedClass

      public static AnnotatedType parameterizedAnnotatedClass(Class<?> clazz, Annotation[] annotations, AnnotatedType... arguments)
    • annotatedInnerClass

      public static AnnotatedType annotatedInnerClass(Type owner, Class<?> clazz, Annotation[] annotations)
    • parameterizedAnnotatedInnerClass

      public static AnnotatedType parameterizedAnnotatedInnerClass(Type owner, Class<?> clazz, Annotation[] annotations, AnnotatedType... arguments)
    • parameterizedAnnotatedInnerClass

      public static AnnotatedType parameterizedAnnotatedInnerClass(AnnotatedType owner, Class<?> clazz, Annotation[] annotations, AnnotatedType... arguments)
    • parameterizedAnnotatedType

      public static AnnotatedParameterizedType parameterizedAnnotatedType(ParameterizedType type, Annotation[] typeAnnotations, Annotation[]... argumentAnnotations)
    • innerClass

      public static Type innerClass(Type owner, Class<?> clazz)
      Creates a type of clazz nested in owner.
      Parameters:
      owner - The owner type. This should be a subtype of clazz.getDeclaringClass(), or null if no owner is known.
      clazz - Type class of the type to create
      Returns:
      A ParameterizedType if the class declaring clazz is generic and its type parameters are known in owner and clazz itself has no type parameters. Otherwise, just returns clazz.
    • parameterizedInnerClass

      public static Type parameterizedInnerClass(Type owner, Class<?> clazz, Type... arguments)
      Creates a type of clazz with arguments as type arguments, nested in owner.

      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 raw clazz. 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 or arguments, null should be given (or parameterizedClass(Class, Type...) or innerClass(Type, Class) could be used). If they are not needed (non-generic owner and/or clazz has no type parameters), they will be filled in automatically. If they are needed but are not given, the raw clazz is returned.

      The specified owner may be any subtype of clazz.getDeclaringClass(). It is automatically converted into the right parameterized version of the declaring class. If clazz is a static (nested) class, the owner is not used.

      Parameters:
      owner - The owner type. This should be a subtype of clazz.getDeclaringClass(), or null if no owner is known.
      clazz - Type class of the type to create
      arguments - Type arguments for the variables of clazz, or null if these are not known.
      Returns:
      A ParameterizedType if clazz or the class declaring clazz is generic, and all the needed type arguments are specified in owner and arguments. Otherwise, just returns clazz.
      Throws:
      IllegalArgumentException - if arguments (is non-null and) has an incorrect length, or if one of the arguments is not within the bounds declared on the matching type variable, or if owner is non-null but clazz has no declaring class (e.g. is a top-level class), or if owner is not a a subtype of clazz.getDeclaringClass().
      NullPointerException - if clazz or one of the elements in arguments is null.
    • checkParametersWithinBound

      private static void checkParametersWithinBound(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:
      IllegalArgumentException - if the type arguments are not within the bounds
    • couldHaveCommonSubtype

      private static boolean couldHaveCommonSubtype(Type type1, Type type2)
      Checks if the intersection of two types is not empty.
    • transformOwner

      private static Type transformOwner(Type givenOwner, Class<?> clazz)
      Transforms the given owner type into an appropriate one when constructing a parameterized type.
    • unboundWildcard

      public static WildcardType unboundWildcard()
      Returns the wildcard type without bounds. This is the '?' in for example List<?>.
      Returns:
      The unbound wildcard type
    • wildcardExtends

      public static WildcardType wildcardExtends(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 WildcardType wildcardSuper(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 Type arrayOf(Type componentType)
      Creates a array type.

      If componentType is not a generic type but a Class object, this returns the Class representing the non-generic array type. Otherwise, returns a GenericArrayType.

      For example:

      • arrayOf(String.class) returns String[].class
      • arrayOf(parameterizedClass(List.class, String.class)) returns the GenericArrayType for List<String>[]
      Parameters:
      componentType - The type of the components of the array.
      Returns:
      An array type.
    • arrayOf

      public static AnnotatedArrayType arrayOf(AnnotatedType componentType, Annotation[] annotations)
      Creates an AnnotatedArrayType wrapped around an array types created by arrayOf(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 Annotation> A annotation(Class<A> annotationType, Map<String,Object> values) throws AnnotationFormatException
      Creates an instance of an annotation.
      Type Parameters:
      A - The type of the annotation.
      Parameters:
      annotationType - The Class 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 matching annotationType
      Throws:
      AnnotationFormatException - Thrown if incomplete or invalid values are provided