Class BridgeMethodResolver
- java.lang.Object
-
- org.easymock.internal.BridgeMethodResolver
-
public final class BridgeMethodResolver extends java.lang.ObjectCode taken from the Spring framework. Helper for resolving syntheticbridge Methodsto theMethodbeing bridged.Given a synthetic
bridge Methodreturns theMethodbeing bridged. A bridge method may be created by the compiler when extending a parameterized type whose methods have parameterized arguments. During runtime invocation the bridgeMethodmay be invoked and/or used via reflection. When attempting to locate annotations onMethods, it is wise to check for bridgeMethodsas 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 privateBridgeMethodResolver()
-
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 namesto concreteClassfor the specifiedClass.private static java.lang.Class<?>extractClassForTypeVariable(java.lang.reflect.TypeVariable<?> typeVariable)Extracts the bound 'Class' for a giveTypeVariable.private static voidextractTypeVariablesFromGenericInterfaces(java.lang.reflect.Type[] genericInterfaces, java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> typeVariableMap)static java.lang.reflect.MethodfindBridgedMethod(java.lang.reflect.Method bridgeMethod)Find the original method for the suppliedbridge Method.private static java.lang.reflect.MethodfindGenericDeclaration(java.lang.reflect.Method bridgeMethod)Search for the genericMethoddeclaration whose erased signature matches that of the supplied bridge method.private static java.lang.reflect.MethodfindMethod(java.lang.Class<?> clazz, java.lang.String name, java.lang.Class<?>[] paramTypes)Attempt to find aMethodon 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.TypegetRawType(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 booleanisBridgedCandidateFor(java.lang.reflect.Method candidateMethod, java.lang.reflect.Method bridgeMethod)Returntrueif the supplied 'candidateMethod' can be consider a validate candidate for theMethodthat isbridgedby the suppliedbridge Method.private static booleanisBridgeMethodFor(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 bridgeMethodis the bridge for the supplied candidateMethod.private static booleanisResolvedTypeMatch(java.lang.reflect.Method genericMethod, java.lang.reflect.Method candidateMethod, java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> typeVariableMap)Returntrueif theTypesignature of both the suppliedgeneric Methodand concreteMethodare equal after resolving allTypeVariablesusing the suppliedTypeVariable Map, otherwise returnsfalse.private static voidpopulateTypeMapFromParameterizedType(java.lang.reflect.ParameterizedType type, java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> typeVariableMap)Read theTypeVariablesfrom the suppliedParameterizedTypeand add mappings corresponding to theTypeVariable name-> concrete type to the suppliedMap.private static java.lang.reflect.MethodsearchCandidates(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.MethodsearchForMatch(java.lang.Class<?> type, java.lang.reflect.Method bridgeMethod)If the suppliedClasshas a declaredMethodwhose signature matches that of the suppliedMethod, then this matchingMethodis returned, otherwisenullis 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
Methodinstance. In such a case, the suppliedMethodinstance 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 bridgedMethodcan 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
nullif none found
-
isBridgedCandidateFor
private static boolean isBridgedCandidateFor(java.lang.reflect.Method candidateMethod, java.lang.reflect.Method bridgeMethod)Returntrueif the supplied 'candidateMethod' can be consider a validate candidate for theMethodthat isbridgedby 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 bridgeMethodis the bridge for the supplied candidateMethod.
-
findGenericDeclaration
private static java.lang.reflect.Method findGenericDeclaration(java.lang.reflect.Method bridgeMethod)
Search for the genericMethoddeclaration 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)Returntrueif theTypesignature of both the suppliedgeneric Methodand concreteMethodare equal after resolving allTypeVariablesusing 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 suppliedClasshas a declaredMethodwhose signature matches that of the suppliedMethod, then this matchingMethodis returned, otherwisenullis returned.
-
createTypeVariableMap
private static java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> createTypeVariableMap(java.lang.Class<?> cls)
Build a mapping ofTypeVariable namesto concreteClassfor 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 theTypeVariablesfrom the suppliedParameterizedTypeand 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 aMethodon the supplied class with the supplied name and parameter types. Searches all superclasses up toObject.Returns
nullif noMethodcan be found.- Parameters:
clazz- the class to introspectname- the name of the methodparamTypes- the parameter types of the method- Returns:
- the Method object, or
nullif 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.
-
-
-