Class BridgeMethodResolver
- java.lang.Object
-
- org.easymock.internal.BridgeMethodResolver
-
public final class BridgeMethodResolver extends java.lang.Object
Code taken from the Spring framework. Helper for resolving syntheticbridge Methods
to theMethod
being bridged.Given a synthetic
bridge Method
returns theMethod
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 bridgeMethod
may be invoked and/or used via reflection. When attempting to locate annotations onMethods
, it is wise to check for bridgeMethods
as appropriate and find the bridgedMethod
.See The Java Language Specification for more details on the use of bridge methods.
-
-
Constructor Summary
Constructors Modifier Constructor Description private
BridgeMethodResolver()
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description private static java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type>
createTypeVariableMap(java.lang.Class<?> cls)
Build a mapping ofTypeVariable names
to concreteClass
for the specifiedClass
.private static java.lang.Class<?>
extractClassForTypeVariable(java.lang.reflect.TypeVariable<?> typeVariable)
Extracts the bound 'Class
' for a giveTypeVariable
.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 suppliedbridge Method
.private static java.lang.reflect.Method
findGenericDeclaration(java.lang.reflect.Method bridgeMethod)
Search for the genericMethod
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 aMethod
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)
Returntrue
if the supplied 'candidateMethod
' can be consider a validate candidate for theMethod
that isbridged
by the suppliedbridge 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 bridgeMethod
is the bridge for the supplied candidateMethod
.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)
Returntrue
if theType
signature of both the suppliedgeneric Method
and concreteMethod
are equal after resolving allTypeVariables
using the suppliedTypeVariable Map
, otherwise returnsfalse
.private static void
populateTypeMapFromParameterizedType(java.lang.reflect.ParameterizedType type, java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> typeVariableMap)
Read theTypeVariables
from the suppliedParameterizedType
and add mappings corresponding to theTypeVariable name
-> concrete type to the suppliedMap
.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 suppliedClass
has a declaredMethod
whose signature matches that of the suppliedMethod
, then this matchingMethod
is returned, otherwisenull
is returned.
-
-
-
Method Detail
-
findBridgedMethod
public static java.lang.reflect.Method findBridgedMethod(java.lang.reflect.Method bridgeMethod)
Find the original method for the suppliedbridge Method
.It is safe to call this method passing in a non-bridge
Method
instance. In such a case, the suppliedMethod
instance is returned directly to the caller. Callers are not required to check for bridging before calling this method.- Parameters:
bridgeMethod
- the bridge method- Returns:
- the original method for the bridge
- Throws:
java.lang.IllegalStateException
- if no bridgedMethod
can be found
-
searchCandidates
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.- Parameters:
candidateMethods
- the List of candidate MethodsbridgeMethod
- the bridge method- Returns:
- the bridged method, or
null
if none found
-
isBridgedCandidateFor
private static boolean isBridgedCandidateFor(java.lang.reflect.Method candidateMethod, java.lang.reflect.Method bridgeMethod)
Returntrue
if the supplied 'candidateMethod
' can be consider a validate candidate for theMethod
that isbridged
by the suppliedbridge Method
. This method performs inexpensive checks and can be used quickly filter for a set of possible matches.
-
isBridgeMethodFor
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 bridgeMethod
is the bridge for the supplied candidateMethod
.
-
findGenericDeclaration
private static java.lang.reflect.Method findGenericDeclaration(java.lang.reflect.Method bridgeMethod)
Search for the genericMethod
declaration whose erased signature matches that of the supplied bridge method.- Throws:
java.lang.IllegalStateException
- if the generic declaration cannot be found
-
isResolvedTypeMatch
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)
Returntrue
if theType
signature of both the suppliedgeneric Method
and concreteMethod
are equal after resolving allTypeVariables
using the suppliedTypeVariable Map
, otherwise returnsfalse
.
-
getRawType
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.
-
searchForMatch
private static java.lang.reflect.Method searchForMatch(java.lang.Class<?> type, java.lang.reflect.Method bridgeMethod)
If the suppliedClass
has a declaredMethod
whose signature matches that of the suppliedMethod
, then this matchingMethod
is returned, otherwisenull
is returned.
-
createTypeVariableMap
private static java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> createTypeVariableMap(java.lang.Class<?> cls)
Build a mapping ofTypeVariable names
to concreteClass
for the specifiedClass
. Searches all super types, enclosing types and interfaces.
-
extractTypeVariablesFromGenericInterfaces
private static void extractTypeVariablesFromGenericInterfaces(java.lang.reflect.Type[] genericInterfaces, java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> typeVariableMap)
-
populateTypeMapFromParameterizedType
private static void populateTypeMapFromParameterizedType(java.lang.reflect.ParameterizedType type, java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> typeVariableMap)
Read theTypeVariables
from the suppliedParameterizedType
and add mappings corresponding to theTypeVariable name
-> concrete type to the suppliedMap
.Consider this case:
-
extractClassForTypeVariable
private static java.lang.Class<?> extractClassForTypeVariable(java.lang.reflect.TypeVariable<?> typeVariable)
Extracts the bound 'Class
' for a giveTypeVariable
.
-
getAllInterfacesForClass
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.If the class itself is an interface, it gets returned as sole interface.
- Parameters:
clazz
- the class to analyse for interfaces- Returns:
- all interfaces that the given object implements as array
-
findMethod
private static java.lang.reflect.Method findMethod(java.lang.Class<?> clazz, java.lang.String name, java.lang.Class<?>[] paramTypes)
Attempt to find aMethod
on the supplied class with the supplied name and parameter types. Searches all superclasses up toObject
.Returns
null
if noMethod
can be found.- Parameters:
clazz
- the class to introspectname
- the name of the methodparamTypes
- the parameter types of the method- Returns:
- the Method object, or
null
if none found
-
getAllDeclaredMethods
private static java.lang.reflect.Method[] getAllDeclaredMethods(java.lang.Class<?> leafClass)
Get all declared methods on the leaf class and all superclasses. Leaf class methods are included first.
-
-
-