Class TypeResolver
java.lang.Object
net.jodah.typetools.TypeResolver
Enhanced type resolution utilities.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprivate static interfacestatic final classAn unknown type. -
Field Summary
Fields -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic voidDisables the internal caching of resolved TypeVariables.static voidEnables the internal caching of resolved TypeVariables.private static MembergetConstantPoolMethodAt(Object constantPool, int i) private static intgetConstantPoolSize(Object constantPool) private static MembergetMemberRef(Class<?> type) private static Map<TypeVariable<?>, Type> getTypeVariableMap(Class<?> targetType, Class<?> functionalInterface) private static booleanisAutoBoxingMethod(Method method) private static booleanprivate static voidpopulateLambdaArgs(Class<?> functionalInterface, Class<?> lambdaType, Map<TypeVariable<?>, Type> map) Populates themapwith variable/argument pairs for thefunctionalInterface.private static voidpopulateSuperTypeArgs(Type[] types, Map<TypeVariable<?>, Type> map, boolean depthFirst) Populates themapwith with variable/argument pairs for the giventypes.private static voidpopulateTypeArgs(ParameterizedType type, Map<TypeVariable<?>, Type> map, boolean depthFirst) Populates themapwith variable/argument pairs for the giventype.static <T, S extends T>
TypeTraverses a generic type and replaces all type variables and wildcard types with concrete types (if possible), by using the type information from givencontext.static TypeTraverses a generic type and replaces all type variables and wildcard types with concrete types (if possible).static TypeTraverses a generic type and replaces all type variables and wildcard types with concrete types (if possible), by using the type information from givencontext.private static Typereify(Type genericType, Map<TypeVariable<?>, Type> typeVariableTypeMap) private static Typereify(Type genericType, Map<TypeVariable<?>, Type> typeVariableMap, Map<ParameterizedType, ReifiedParameterizedType> partial) Works likeresolveRawClass(Type, Class, Class)but does not stop at raw classes.static TyperesolveBound(TypeVariable<?> typeVariable) Resolves the first bound for thetypeVariable, returningUnknown.classif none can be resolved.static TyperesolveGenericType(Class<?> type, Type subType) Returns the generictypeusing type variable information from thesubTypeelsenullif the generic type cannot be resolved.static <T, S extends T>
Class<?> resolveRawArgument(Class<T> type, Class<S> subType) Returns the raw class representing the argument for thetypeusing type variable information from thesubType.static Class<?> resolveRawArgument(Type genericType, Class<?> subType) Returns the raw class representing the argument for thegenericTypeusing type variable information from thesubType.static <T, S extends T>
Class<?>[]resolveRawArguments(Class<T> type, Class<S> subType) Returns an array of raw classes representing arguments for thetypeusing type variable information from thesubType.static Class<?>[]resolveRawArguments(Type genericType, Class<?> subType) Returns an array of raw classes representing arguments for thegenericTypeusing type variable information from thesubType.static Class<?> resolveRawClass(Type genericType, Class<?> subType) Resolves the raw class for thegenericType, using the type variable information from thesubTypeelseTypeResolver.Unknownif the raw class cannot be resolved.private static Class<?> resolveRawClass(Type genericType, Class<?> subType, Class<?> functionalInterface) private static Class<?> wrapPrimitives(Class<?> clazz)
-
Field Details
-
TYPE_VARIABLE_CACHE
-
CACHE_ENABLED
private static volatile boolean CACHE_ENABLED -
RESOLVES_LAMBDAS
private static boolean RESOLVES_LAMBDAS -
JAVA_LANG_ACCESS
-
GET_CONSTANT_POOL
-
GET_CONSTANT_POOL_SIZE
-
GET_CONSTANT_POOL_METHOD_AT
-
OBJECT_METHODS
-
PRIMITIVE_WRAPPERS
-
JAVA_VERSION
-
-
Constructor Details
-
TypeResolver
private TypeResolver()
-
-
Method Details
-
enableCache
public static void enableCache()Enables the internal caching of resolved TypeVariables. -
disableCache
public static void disableCache()Disables the internal caching of resolved TypeVariables. -
resolveRawArgument
Returns the raw class representing the argument for thetypeusing type variable information from thesubType. If no arguments can be resolved thenUnknown.classis returned.- Parameters:
type- to resolve argument forsubType- to extract type variable information from- Returns:
- argument for
typeelseTypeResolver.Unknown.class if no type arguments are declared - Throws:
IllegalArgumentException- if more or less than one argument is resolved for thetype
-
resolveRawArgument
Returns the raw class representing the argument for thegenericTypeusing type variable information from thesubType. IfgenericTypeis an instance of class, thengenericTypeis returned. If no arguments can be resolved thenUnknown.classis returned.- Parameters:
genericType- to resolve argument forsubType- to extract type variable information from- Returns:
- argument for
genericTypeelseTypeResolver.Unknown.class if no type arguments are declared - Throws:
IllegalArgumentException- if more or less than one argument is resolved for thegenericType
-
resolveRawArguments
Returns an array of raw classes representing arguments for thetypeusing type variable information from thesubType. Arguments fortypethat cannot be resolved are returned asUnknown.class. If no arguments can be resolved thennullis returned.- Parameters:
type- to resolve arguments forsubType- to extract type variable information from- Returns:
- array of raw classes representing arguments for the
typeelsenullif no type arguments are declared
-
reify
Traverses a generic type and replaces all type variables and wildcard types with concrete types (if possible), by using the type information from givencontext. A convenience method which largely works the same asreify(Type, Class), but first resolves the generic type oftype.- Parameters:
type- the class whose generic type to traversecontext- the class that serves as starting point to resolve replacements of type variables- Returns:
- a type that is structurally the same as
type, except that type variables and wildcard types have been replaced with concrete types - Throws:
UnsupportedOperationException- iftype(or a type that it references) is not an instance of one of the following types:Class,TypeVariable,WildcardType,ParameterizedType,GenericArrayType.UnsupportedOperationException- iftype(or a type that it references) is aWildcardTypethat does not have exactly one upper bound, or does not have no lower bounds.UnsupportedOperationException- iftype(or a type that it references) is aGenericArrayTypewhose generic component type cannot be reified to an instance ofClass.
-
reify
Traverses a generic type and replaces all type variables and wildcard types with concrete types (if possible), by using the type information from givencontext. Generic types used as input to this method are commonly obtained using reflection, e.g. viaField.getGenericType(),Method.getGenericReturnType(),Method.getGenericParameterTypes(). Example:
Reifying the generic return type of the methodclass A<T> { public T something; public Optional<List<T>> compute() { ... } } class B extends A<Number> { public <? extends Collection<List<?>>> collect() { ... } }computewithB.classascontextwill yield the parameterized typeOptional<List<Number>>. Note that not the raw type (Optionalis returned, but the input type is reified recursively. Reifying the generic type of the fieldsomethingwithB.classascontextwill yieldNumber.class. Note that type variables with no explicit upper bound are reified toObject, andUnknown.classis never returned.- Parameters:
type- the generic type to traversecontext- the class that serves as starting point to resolve replacements of type variables- Returns:
- a type that is structurally the same as
type, except that type variables and wildcard types have been replaced with concrete types - Throws:
UnsupportedOperationException- iftype(or a type that it references) is not an instance of one of the following types:Class,TypeVariable,WildcardType,ParameterizedType,GenericArrayType.UnsupportedOperationException- iftype(or a type that it references) is aWildcardTypethat does not have exactly one upper bound, or does not have no lower bounds.UnsupportedOperationException- iftype(or a type that it references) is aGenericArrayTypewhose generic component type cannot be reified to an instance ofClass.
-
reify
Traverses a generic type and replaces all type variables and wildcard types with concrete types (if possible). A convenience wrapper aroundreify(Type, Class), for when no context is needed/available. Generic types used as input to this method are commonly obtained using reflection, e.g. viaField.getGenericType(),Method.getGenericReturnType(),Method.getGenericParameterTypes(). Example:
Reifying the generic return type of the methodclass X { public List<? extends Collection<List<? extends Number>>> collectList() { ... } public Set<?> collectSet() { ... } }collectListwill yield the parameterized typeList<Collection<List<Number>>>. Reifying the generic return type of the methodcollectSetwill yield the parameterized typeSet<Object>, since there is no explicit upper bound for the wildcard type given.- Parameters:
type- the generic type to traverse- Returns:
- a type that is structurally the same as
type, except that type variables and wildcard types have been replaced with concrete types - Throws:
UnsupportedOperationException- iftype(or a type that it references) is not an instance of one of the following types:Class,TypeVariable,WildcardType,ParameterizedType,GenericArrayType.UnsupportedOperationException- iftype(or a type that it references) is aWildcardTypethat does not have exactly one upper bound, or does not have no lower bounds.UnsupportedOperationException- iftype(or a type that it references) is aGenericArrayTypewhose generic component type cannot be reified to an instance ofClass.
-
resolveRawArguments
Returns an array of raw classes representing arguments for thegenericTypeusing type variable information from thesubType. Arguments forgenericTypethat cannot be resolved are returned asUnknown.class. If no arguments can be resolved thennullis returned.- Parameters:
genericType- to resolve arguments forsubType- to extract type variable information from- Returns:
- array of raw classes representing arguments for the
genericTypeelsenullif no type arguments are declared
-
resolveGenericType
Returns the generictypeusing type variable information from thesubTypeelsenullif the generic type cannot be resolved.- Parameters:
type- to resolve generic type forsubType- to extract type variable information from- Returns:
- generic
typeelsenullif it cannot be resolved
-
resolveRawClass
Resolves the raw class for thegenericType, using the type variable information from thesubTypeelseTypeResolver.Unknownif the raw class cannot be resolved.- Parameters:
genericType- to resolve raw class forsubType- to extract type variable information from- Returns:
- raw class for the
genericTypeelseTypeResolver.Unknownif it cannot be resolved
-
resolveRawClass
-
reify
-
reify
private static Type reify(Type genericType, Map<TypeVariable<?>, Type> typeVariableMap, Map<ParameterizedType, ReifiedParameterizedType> partial) Works likeresolveRawClass(Type, Class, Class)but does not stop at raw classes. Instead, traverses referenced types.- Parameters:
partial- contains a mapping of generic types to reified types. A value ofnullinside aReifiedParameterizedTypeinstance means that this type is currently being reified.
-
getTypeVariableMap
private static Map<TypeVariable<?>, Type> getTypeVariableMap(Class<?> targetType, Class<?> functionalInterface) -
populateSuperTypeArgs
private static void populateSuperTypeArgs(Type[] types, Map<TypeVariable<?>, Type> map, boolean depthFirst) Populates themapwith with variable/argument pairs for the giventypes. -
populateTypeArgs
private static void populateTypeArgs(ParameterizedType type, Map<TypeVariable<?>, Type> map, boolean depthFirst) Populates themapwith variable/argument pairs for the giventype. -
resolveBound
Resolves the first bound for thetypeVariable, returningUnknown.classif none can be resolved. -
populateLambdaArgs
private static void populateLambdaArgs(Class<?> functionalInterface, Class<?> lambdaType, Map<TypeVariable<?>, Type> map) Populates themapwith variable/argument pairs for thefunctionalInterface. -
isDefaultMethod
-
getMemberRef
-
isAutoBoxingMethod
-
wrapPrimitives
-
getConstantPoolSize
-
getConstantPoolMethodAt
-