public abstract class GenericsContext
extends java.lang.Object
Usage: navigate to required type context.type(MyClass.class) and use utility methods to
get type's own generics or as helper for methods/fields introspection.
To navigate to method context use context.method(method).
Every context object is immutable. Context doesn't hold actual types hierarchy (use reflection api in parallel if you need hierarchy info). Navigation is allowed to any class (within original root class hierarchy) from any child context. For convenience root class is also allowed (no matter the fact that it doesn't contain resolved generics).
API operated mainly on types, because it's the only way to resolve recursive generics: e.g. when you have
List<Integer> then generic could be represented as Integer class, but if
List<Collection<Integer>> we can't represent generic as class (Collection),
because this makes actual collection generic not accessible)
Complete example: suppose we have class A extends B<Integer>.
GenericsResolver.resolve(A.class).type(B.class).generic(0) == Integer.class
| Modifier and Type | Field and Description |
|---|---|
protected java.lang.Class<?> |
currentType |
protected GenericsInfo |
genericsInfo |
protected java.util.Map<java.lang.String,java.lang.reflect.Type> |
typeGenerics |
| Constructor and Description |
|---|
GenericsContext(GenericsInfo genericsInfo,
java.lang.Class<?> type) |
| Modifier and Type | Method and Description |
|---|---|
protected abstract java.util.Map<java.lang.String,java.lang.reflect.Type> |
contextGenerics() |
java.lang.Class<?> |
currentClass() |
java.lang.Class<?> |
generic(int position)
class A extends B<Object, C<Long>>. |
java.lang.Class<?> |
generic(java.lang.String genericName)
class B<T, K>. |
java.lang.String |
genericAsString(int position)
class A extends B<Object, C<Long>>. |
java.lang.String |
genericAsString(java.lang.String genericName)
class B<T, K>. |
java.util.List<java.lang.Class<?>> |
generics()
class A extends B<Object, C<Long>>. |
java.util.List<java.lang.String> |
genericsAsString()
class A extends B<Object, C<Long>>. |
java.util.Map<java.lang.String,java.lang.reflect.Type> |
genericsMap()
class A extends B<Object, C<Long>> and class B<T, K>. |
java.lang.reflect.Type |
genericType(int position)
class A extends B<Object, C<Long>>. |
java.lang.reflect.Type |
genericType(java.lang.String genericName)
class B<T, K>. |
java.util.List<java.lang.reflect.Type> |
genericTypes()
class A extends B<Object, C<Long>>. |
GenericsInfo |
getGenericsInfo() |
MethodGenericsContext |
method(java.lang.reflect.Method method)
Navigates current context to specific method (type context is switched(!)
|
java.lang.Class<?> |
resolveClass(java.lang.reflect.Type type)
Useful for introspection to know exact class of type.
|
java.lang.Class<?> |
resolveGenericOf(java.lang.reflect.Type type)
Shortcut for
resolveGenericsOf(java.lang.reflect.Type) useful for single generic types or
when just first generic required. |
java.util.List<java.lang.Class<?>> |
resolveGenericsOf(java.lang.reflect.Type type)
Useful for introspection, to know exact generic value.
|
java.lang.String |
toStringType(java.lang.reflect.Type type)
Useful for reporting or maybe logging.
|
TypeGenericsContext |
type(java.lang.Class<?> type)
Navigates current context to specific type in class hierarchy.
|
protected final GenericsInfo genericsInfo
protected final java.lang.Class<?> currentType
protected final java.util.Map<java.lang.String,java.lang.reflect.Type> typeGenerics
public GenericsContext(GenericsInfo genericsInfo, java.lang.Class<?> type)
public java.lang.Class<?> currentClass()
public java.util.List<java.lang.reflect.Type> genericTypes()
class A extends B<Object, C<Long>>.
type(B.class).genericTypes() == [Class<Object>, ParametrizedType] public java.util.List<java.lang.Class<?>> generics()
class A extends B<Object, C<Long>>.
type(B.class).generics() == [Class<Object>, Class<C>]
Note that this way you loose second level generics info (Long from C class)public java.util.List<java.lang.String> genericsAsString()
class A extends B<Object, C<Long>>.
type(B.class).genericsAsString() == ["Object", "C<Long>"]
Note, that returned generics are completely resolved, e.g.
A extends B<Object> , where B<T> extends C<T, List<T>>,
and when we call type(C.class).genericsAsString() == ["Object", "List<Object>]public java.lang.reflect.Type genericType(int position)
class A extends B<Object, C<Long>>.
type(B.class).genericType(1) == ParametrizedType position - generic position (from 0)java.lang.IndexOutOfBoundsException - for wrong indexfor detailspublic java.lang.reflect.Type genericType(java.lang.String genericName)
class B<T, K>.
class A extends B<Object, C<Long>>
type(B.class).genericType("K") == ParametrizedType genericName - generic position (from 0)java.lang.IllegalArgumentException - for wrong generic namefor detailspublic java.lang.Class<?> generic(int position)
class A extends B<Object, C<Long>>.
type(B.class).generic(1) == C.class position - generic position (from 0)java.lang.IndexOutOfBoundsException - for wrong indexresolveClass(java.lang.reflect.Type)public java.lang.Class<?> generic(java.lang.String genericName)
class B<T, K>.
class A extends B<Object, C<Long>>
type(B.class).generic("K") == C.class genericName - generic namejava.lang.IllegalArgumentException - for wrong generic nameresolveClass(java.lang.reflect.Type)public java.lang.String genericAsString(int position)
class A extends B<Object, C<Long>>.
type(B.class).genericAsString(1) == "C<Long>" position - generic position (from 0)java.lang.IndexOutOfBoundsException - for wrong indextoStringType(java.lang.reflect.Type)public java.lang.String genericAsString(java.lang.String genericName)
class B<T, K>.
class A extends B<Object, C<Long>>
type(B.class).genericAsString("K") == "C<Long>" genericName - generic namejava.lang.IllegalArgumentException - for wrong generic nametoStringType(java.lang.reflect.Type)public java.util.Map<java.lang.String,java.lang.reflect.Type> genericsMap()
class A extends B<Object, C<Long>> and class B<T, K>.
type(B.class).genericsMap() == ["T": Object.class, "K": ParametrizedType]public GenericsInfo getGenericsInfo()
public java.lang.Class<?> resolveClass(java.lang.reflect.Type type)
class A extends B<Long>;
class B<T> {
T doSmth();
}
Resolving class of return type:
type(B.class).resolveClass(B.class.getMethod("doSmth").getGenericReturnType()) == Long.classtype - type to resolve classpublic java.util.List<java.lang.Class<?>> resolveGenericsOf(java.lang.reflect.Type type)
throws NoGenericException
class A extends B<Long>;
class B<T> {
List<T> doSmth();
}
Resolving parameters in context of root class:
type(B.class).resolveGenericsOf(B.class.getMethod("doSmth").getGenericReturnType()) == [Long.class]type - type to resolve genericsNoGenericException - if provided type does not contain generic (exception required to distinguish
Object.class generic value from class which doesn't support genericpublic java.lang.Class<?> resolveGenericOf(java.lang.reflect.Type type)
throws NoGenericException
resolveGenericsOf(java.lang.reflect.Type) useful for single generic types or
when just first generic required.type - type to resolve genericNoGenericException - if provided type does not contain generic (exception required to distinguish
Object.class generic value from class which doesn't support genericpublic java.lang.String toStringType(java.lang.reflect.Type type)
class A extends B<Long>;
class B<T> {
List<T> doSmth();
}
Resolving parameters in type of root class:
type(B.class).toStringType(B.class.getMethod("doSmth").getGenericReturnType()) == "List<Long>"type - to to get string ofpublic TypeGenericsContext type(java.lang.Class<?> type)
type - class to navigate tojava.lang.IllegalArgumentException - if requested class is not present in root class hierarchypublic MethodGenericsContext method(java.lang.reflect.Method method)
<T> void myMethod(T arg);.
Use context to work with method parameters, return type or resolving types inside method.
method - method in current class to navigate tojava.lang.IllegalArgumentException - if requested method is not present in current class hierarchyprotected abstract java.util.Map<java.lang.String,java.lang.reflect.Type> contextGenerics()