public class MethodGenericsContext extends GenericsContext
class A {
<T> T method();
}
Such generics are not known in type and, as a result, any operation on type with such generic will lead to
unknown generic exception.
Also, context contains special methods for parameters and return type analysis.
GenericsContext.RootContextAwareTypeWriterallTypeGenerics, CURRENT_POSITION_MARKER, ownerGenerics, ownerTypecurrentType, genericsInfo, typeGenerics| Constructor and Description |
|---|
MethodGenericsContext(GenericsInfo genericsInfo,
java.lang.reflect.Method method,
GenericsContext root) |
| Modifier and Type | Method and Description |
|---|---|
protected java.util.Map<java.lang.String,java.lang.reflect.Type> |
contextGenerics() |
java.lang.reflect.Method |
currentMethod() |
GenericDeclarationScope |
getGenericsScope()
For example,
CLASS scope could resolve only class level generics, whereas
METHOD could see method context generics. |
java.lang.reflect.GenericDeclaration |
getGenericsSource()
Declaration source could be: class, method or constructor.
|
MethodGenericsContext |
method(java.lang.reflect.Method method)
Navigates current context to specific method (type context is switched to method declaring class).
|
java.util.Map<java.lang.String,java.lang.reflect.Type> |
methodGenericsMap()
class A<E> {
<T, K extends E> K method(T arg);
}
class B extends A<Serializable> {}
context.method(A.class.getMethod("method", Object.class)).methodGenericsMap() ==
["T": Object.class, "K": Serializable.class]
For method generics it's impossible to know actual type (available only in time of method call),
so generics resolved as upper bound. |
java.util.List<java.lang.reflect.Type> |
methodGenericTypes()
<T extends Serializable> T method();. |
GenericsContext |
parameterType(int pos)
Create generics context for parameter type (with correctly resolved root generics).
|
GenericsContext |
parameterTypeAs(int pos,
java.lang.Class<?> asType)
Create generics context for actual class, passed into parameter type (assuming you have access to that instance
or know exact type).
|
java.util.List<java.lang.Class<?>> |
resolveParameters()
Useful for introspection, to know exact parameter types.
|
java.util.List<java.lang.reflect.Type> |
resolveParametersTypes()
Returns parameter types with resolved generic variables.
|
java.lang.reflect.Type |
resolveParameterType(int pos) |
java.lang.Class<?> |
resolveReturnClass()
Useful for introspection, to know exact return type of generified method.
|
java.lang.reflect.Type |
resolveReturnType()
class B extends A<Long> {}
class A<T> {
List<T> get();
}. |
java.lang.Class<?> |
resolveReturnTypeGeneric()
Shortcut for
resolveReturnTypeGenerics() useful for single generic types or
when just first generic required. |
java.util.List<java.lang.Class<?>> |
resolveReturnTypeGenerics()
Useful for introspection, to know exact generic value.
|
GenericsContext |
returnType()
Create generics context for return type (with correctly resolved root generics).
|
GenericsContext |
returnTypeAs(java.lang.Class<?> asType)
Create generics context for actual class, returned form method (assuming you have access to that instance
or know exact type).
|
java.lang.String |
toString() |
java.lang.String |
toStringMethod() |
chooseContext, constructor, inlyingType, inlyingTypeAs, isInlying, ownerClass, ownerGenericsMap, rootContext, switchContext, typecurrentClass, fieldType, fieldTypeAs, generic, generic, genericAsString, genericAsString, generics, genericsAsString, genericsMap, genericType, genericType, genericTypes, getGenericsInfo, resolveClass, resolveFieldClass, resolveFieldGeneric, resolveFieldGenerics, resolveFieldType, resolveGenericOf, resolveGenericsOf, resolveType, resolveTypeGenerics, toStringCurrentClass, toStringCurrentClassDeclaration, toStringType, visibleGenericsMappublic MethodGenericsContext(GenericsInfo genericsInfo, java.lang.reflect.Method method, GenericsContext root)
public java.lang.reflect.Method currentMethod()
public java.util.List<java.lang.reflect.Type> methodGenericTypes()
<T extends Serializable> T method();.
context.method(A.getMethod('method')).methodGenericTypes() == [Class<Serializable>]public java.util.Map<java.lang.String,java.lang.reflect.Type> methodGenericsMap()
class A<E> {
<T, K extends E> K method(T arg);
}
class B extends A<Serializable> {}
context.method(A.class.getMethod("method", Object.class)).methodGenericsMap() ==
["T": Object.class, "K": Serializable.class]
For method generics it's impossible to know actual type (available only in time of method call),
so generics resolved as upper bound.public java.lang.Class<?> resolveReturnClass()
class A extends B<Long>;
class B<T> {
T doSmth();
}
Resolving return type in type of root class:
type(B.class).resolveReturnClass(B.class.getMethod("doSmth")) == Long.class
Note: may return primitive because it might be important to differentiate actual value.
Use TypeUtils.wrapPrimitive(Class) to box possible primitive,
if required.
AbstractGenericsContext.resolveClass(java.lang.reflect.Type)public java.util.List<java.lang.Class<?>> resolveParameters()
class A extends B<Long> {}
class B<T> {
void doSmth(T a, Integer b);
}
Resolving parameters in context of root class:
method(B.class.getMethod("doSmth", Object.class, Integer.class)).resolveParameters() ==
[Long.class, Integer.class]
Note: may return primitives because it might be important to differentiate actual value.
Use TypeUtils.wrapPrimitive(Class) to box possible primitives,
if required.
resolveParametersTypes()public java.util.List<java.lang.reflect.Type> resolveParametersTypes()
class A extends B<Long> {}
class B<T>{
void doSmth(List<T> a);
}
Resolving parameters types in context of root class:
method(B.class.getMethod("doSmth", List.class)).resolveParametersTypes() == [List<Long>]resolveParameters()public java.lang.reflect.Type resolveParameterType(int pos)
pos - parameter position (form 0)java.lang.IllegalArgumentException - if parameter index is incorrectpublic GenericsContext parameterType(int pos)
class A<T> {
void doSmth(B<T>);
}
class C extends A<String> {}
Build generics context for parameter type (to continue analyzing parameter type fields):
(context of C).method(A.class.getMethod("getSmth", B.class)).parameterType(0)
== generics context of B<String>
Note that, in contrast to direct resolution GenericsResolver.resolve(B.class), actual root generic
would be counted for hierarchy resolution.
pos - parameter position (from 0)java.lang.IllegalArgumentException - if parameter index is incorrectGenericsContext.inlyingType(Type)public GenericsContext parameterTypeAs(int pos, java.lang.Class<?> asType)
Other than target type, method is the same as parameterType(int).
pos - parameter position (from 0)asType - required target type to build generics context for (must include declared type as base class)java.lang.IllegalArgumentException - if parameter index is incorrectGenericsContext.inlyingTypeAs(Type, Class)public java.util.List<java.lang.Class<?>> resolveReturnTypeGenerics()
class A extends B<Long>;
class B<T> {
List<T> doSmth();
}
Resolving parameters in context of root class:
type(B.class).method(B.class.getMethod("doSmth")).resolveReturnTypeGenerics() == [Long.class]public java.lang.Class<?> resolveReturnTypeGeneric()
resolveReturnTypeGenerics() useful for single generic types or
when just first generic required.public java.lang.reflect.Type resolveReturnType()
class B extends A<Long> {}
class A<T> {
List<T> get();
}.
(context of B).method(A.class.getMethod("get")).resolveReturnType() == List<Long>public GenericsContext returnType()
class A<T> {
B<T> doSmth();
}
class C extends A<String> {}
Build generics context for returning type (to continue analyzing return type fields):
type(A.class).method(A.class.getMethod("getSmth")).returnType() == generics context of B<String>
Note that, in contrast to direct resolution GenericsResolver.resolve(B.class), actual root generic
would be counted for hierarchy resolution.
GenericsContext.inlyingType(Type)public GenericsContext returnTypeAs(java.lang.Class<?> asType)
Other than target type, method is the same as returnType().
asType - required target type to build generics context for (must include declared type as base class)GenericsContext.inlyingTypeAs(Type, Class)public java.lang.String toStringMethod()
public java.lang.String toString()
toString in class GenericsContextpublic GenericDeclarationScope getGenericsScope()
AbstractGenericsContextCLASS scope could resolve only class level generics, whereas
METHOD could see method context generics. May be used for current context differentiation
(instead of instanceof).getGenericsScope in class GenericsContextAbstractGenericsContext.getGenericsSource()public java.lang.reflect.GenericDeclaration getGenericsSource()
AbstractGenericsContextgetGenericsSource in class GenericsContextAbstractGenericsContext.getGenericsScope()public MethodGenericsContext method(java.lang.reflect.Method method)
AbstractGenericsContext<T> void myMethod(T arg);.
Use context to work with method parameters, return type or resolving types inside method.
method in class GenericsContextmethod - method in current class hierarchy to navigate to (may be method from subclass, relative to
currently selected, in this case context type will be automatically switched)protected java.util.Map<java.lang.String,java.lang.reflect.Type> contextGenerics()
contextGenerics in class GenericsContext