public final class BridgeMethodResolver
extends java.lang.Object
bridge Methods
to the
Method
being bridged.
Given a synthetic bridge Method
returns the
Method
being bridged. A bridge method may be created by the compiler
when extending a parameterized type whose methods have parameterized
arguments. During runtime invocation the bridge Method
may be invoked
and/or used via reflection. When attempting to locate annotations on
Methods
, it is wise to check for bridge Methods
as appropriate and find the bridged Method
.
See The Java Language Specification for more details on the use of bridge methods.
Modifier | Constructor and Description |
---|---|
private |
BridgeMethodResolver() |
Modifier and Type | Method and Description |
---|---|
private static java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> |
createTypeVariableMap(java.lang.Class<?> cls)
Build a mapping of
TypeVariable names to
concrete Class for the specified Class . |
private static java.lang.Class<?> |
extractClassForTypeVariable(java.lang.reflect.TypeVariable<?> typeVariable)
Extracts the bound '
Class ' for a give TypeVariable . |
private static void |
extractTypeVariablesFromGenericInterfaces(java.lang.reflect.Type[] genericInterfaces,
java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> typeVariableMap) |
static java.lang.reflect.Method |
findBridgedMethod(java.lang.reflect.Method bridgeMethod)
Find the original method for the supplied
bridge Method . |
private static java.lang.reflect.Method |
findGenericDeclaration(java.lang.reflect.Method bridgeMethod)
Search for the generic
Method declaration whose erased signature
matches that of the supplied bridge method. |
private static java.lang.reflect.Method |
findMethod(java.lang.Class<?> clazz,
java.lang.String name,
java.lang.Class<?>[] paramTypes)
Attempt to find a
Method on the supplied class with the supplied
name and parameter types. |
private static java.lang.reflect.Method[] |
getAllDeclaredMethods(java.lang.Class<?> leafClass)
Get all declared methods on the leaf class and all superclasses.
|
private static java.lang.Class<?>[] |
getAllInterfacesForClass(java.lang.Class<?> clazz)
Return all interfaces that the given class implements as array, including
ones implemented by superclasses.
|
private static java.lang.reflect.Type |
getRawType(java.lang.reflect.Type genericType,
java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> typeVariableMap)
Determine the raw type for the given generic parameter type.
|
private static boolean |
isBridgedCandidateFor(java.lang.reflect.Method candidateMethod,
java.lang.reflect.Method bridgeMethod)
Return
true if the supplied 'candidateMethod '
can be consider a validate candidate for the Method that is
bridged by the supplied bridge
Method . |
private static boolean |
isBridgeMethodFor(java.lang.reflect.Method bridgeMethod,
java.lang.reflect.Method candidateMethod,
java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> typeVariableMap)
Determine whether or not the bridge
Method is the bridge for the
supplied candidate Method . |
private static boolean |
isResolvedTypeMatch(java.lang.reflect.Method genericMethod,
java.lang.reflect.Method candidateMethod,
java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> typeVariableMap)
Return
true if the Type signature of both the
supplied generic Method and
concrete Method are equal after resolving all
TypeVariables using the supplied
TypeVariable Map , otherwise returns
false . |
private static void |
populateTypeMapFromParameterizedType(java.lang.reflect.ParameterizedType type,
java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> typeVariableMap)
Read the
TypeVariables from the supplied
ParameterizedType and add mappings corresponding to the
TypeVariable name -> concrete type to the
supplied Map . |
private static java.lang.reflect.Method |
searchCandidates(java.util.List<java.lang.reflect.Method> candidateMethods,
java.lang.reflect.Method bridgeMethod)
Search for the bridged method in the given candidates.
|
private static java.lang.reflect.Method |
searchForMatch(java.lang.Class<?> type,
java.lang.reflect.Method bridgeMethod)
If the supplied
Class has a declared Method whose
signature matches that of the supplied Method , then this matching
Method is returned, otherwise null is returned. |
public static java.lang.reflect.Method findBridgedMethod(java.lang.reflect.Method bridgeMethod)
bridge Method
.
It is safe to call this method passing in a non-bridge Method
instance. In such a case, the supplied Method
instance is
returned directly to the caller. Callers are not
required to check for bridging before calling this method.
bridgeMethod
- the bridge methodjava.lang.IllegalStateException
- if no bridged Method
can be foundprivate static java.lang.reflect.Method searchCandidates(java.util.List<java.lang.reflect.Method> candidateMethods, java.lang.reflect.Method bridgeMethod)
candidateMethods
- the List of candidate MethodsbridgeMethod
- the bridge methodnull
if none foundprivate static boolean isBridgedCandidateFor(java.lang.reflect.Method candidateMethod, java.lang.reflect.Method bridgeMethod)
true
if the supplied 'candidateMethod
'
can be consider a validate candidate for the Method
that is
bridged
by the supplied bridge
Method
. This method performs inexpensive checks and can be used quickly
filter for a set of possible matches.private static boolean isBridgeMethodFor(java.lang.reflect.Method bridgeMethod, java.lang.reflect.Method candidateMethod, java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> typeVariableMap)
Method
is the bridge for the
supplied candidate Method
.private static java.lang.reflect.Method findGenericDeclaration(java.lang.reflect.Method bridgeMethod)
Method
declaration whose erased signature
matches that of the supplied bridge method.java.lang.IllegalStateException
- if the generic declaration cannot be foundprivate static boolean isResolvedTypeMatch(java.lang.reflect.Method genericMethod, java.lang.reflect.Method candidateMethod, java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> typeVariableMap)
true
if the Type
signature of both the
supplied generic Method
and
concrete Method
are equal after resolving all
TypeVariables
using the supplied
TypeVariable Map
, otherwise returns
false
.private static java.lang.reflect.Type getRawType(java.lang.reflect.Type genericType, java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> typeVariableMap)
private static java.lang.reflect.Method searchForMatch(java.lang.Class<?> type, java.lang.reflect.Method bridgeMethod)
Class
has a declared Method
whose
signature matches that of the supplied Method
, then this matching
Method
is returned, otherwise null
is returned.private static java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> createTypeVariableMap(java.lang.Class<?> cls)
TypeVariable names
to
concrete Class
for the specified Class
. Searches all
super types, enclosing types and interfaces.private static void extractTypeVariablesFromGenericInterfaces(java.lang.reflect.Type[] genericInterfaces, java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> typeVariableMap)
private static void populateTypeMapFromParameterizedType(java.lang.reflect.ParameterizedType type, java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> typeVariableMap)
TypeVariables
from the supplied
ParameterizedType
and add mappings corresponding to the
TypeVariable name
-> concrete type to the
supplied Map
.
Consider this case:
private static java.lang.Class<?> extractClassForTypeVariable(java.lang.reflect.TypeVariable<?> typeVariable)
Class
' for a give TypeVariable
.private static java.lang.Class<?>[] getAllInterfacesForClass(java.lang.Class<?> clazz)
If the class itself is an interface, it gets returned as sole interface.
clazz
- the class to analyse for interfacesprivate static java.lang.reflect.Method findMethod(java.lang.Class<?> clazz, java.lang.String name, java.lang.Class<?>[] paramTypes)
Method
on the supplied class with the supplied
name and parameter types. Searches all superclasses up to
Object
.
Returns null
if no Method
can be found.
clazz
- the class to introspectname
- the name of the methodparamTypes
- the parameter types of the methodnull
if none foundprivate static java.lang.reflect.Method[] getAllDeclaredMethods(java.lang.Class<?> leafClass)