Top Description Constructors Methods
org.easymock.internal

public final Class BridgeMethodResolver

extends Object
Class Inheritance
Imports
java.lang.reflect.*, java.util.*

Code taken from the Spring framework. Helper for resolving synthetic 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.

Authors
Rob Harrop, Juergen Hoeller

Constructor Summary

AccessConstructor and Description
private

Method Summary

Modifier and TypeMethod and Description
private static Map<TypeVariable<?>, Type>
createTypeVariableMap(Class<?> cls)

Build a mapping of TypeVariable names to concrete Class for the specified Class.

private static Class<?>
extractClassForTypeVariable(TypeVariable<?> typeVariable)

Extracts the bound 'Class' for a give TypeVariable.

private static void
extractTypeVariablesFromGenericInterfaces(Type[] genericInterfaces, Map<TypeVariable<?>, Type> typeVariableMap)

public static Method

Returns:

the original method for the bridge
findBridgedMethod
(Method
the bridge method
bridgeMethod
)

Find the original method for the supplied bridge Method.

private static Method
findGenericDeclaration(Method bridgeMethod)

Search for the generic Method declaration whose erased signature matches that of the supplied bridge method.

private static Method

Returns:

the Method object, or null if none found
findMethod
(Class<?>
the class to introspect
clazz
,
String
the name of the method
name
,
Class<?>[]
the parameter types of the method
paramTypes
)

Attempt to find a Method on the supplied class with the supplied name and parameter types.

private static Method[]
getAllDeclaredMethods(Class<?> leafClass)

Get all declared methods on the leaf class and all superclasses.

private static Class<?>[]

Returns:

all interfaces that the given object implements as array
getAllInterfacesForClass
(Class<?>
the class to analyse for interfaces
clazz
)

Return all interfaces that the given class implements as array, including ones implemented by superclasses.

private static Type
getRawType(Type genericType, Map<TypeVariable<?>, Type> typeVariableMap)

Determine the raw type for the given generic parameter type.

private static boolean
isBridgedCandidateFor(Method candidateMethod, 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(Method bridgeMethod, Method candidateMethod, Map<TypeVariable<?>, Type> typeVariableMap)

Determine whether or not the bridge Method is the bridge for the supplied candidate Method.

private static boolean
isResolvedTypeMatch(Method genericMethod, Method candidateMethod, Map<TypeVariable<?>, 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(ParameterizedType type, Map<TypeVariable<?>, 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 Method

Returns:

the bridged method, or null if none found
searchCandidates
(List<Method>
the List of candidate Methods
candidateMethods
,
Method
the bridge method
bridgeMethod
)

Search for the bridged method in the given candidates.

private static Method
searchForMatch(Class<?> type, 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.

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Constructor Detail

BridgeMethodResolverback to summary
private BridgeMethodResolver()

Method Detail

createTypeVariableMapback to summary
private static Map<TypeVariable<?>, Type> createTypeVariableMap(Class<?> cls)

Build a mapping of TypeVariable names to concrete Class for the specified Class. Searches all super types, enclosing types and interfaces.

extractClassForTypeVariableback to summary
private static Class<?> extractClassForTypeVariable(TypeVariable<?> typeVariable)

Extracts the bound 'Class' for a give TypeVariable.

extractTypeVariablesFromGenericInterfacesback to summary
private static void extractTypeVariablesFromGenericInterfaces(Type[] genericInterfaces, Map<TypeVariable<?>, Type> typeVariableMap)
findBridgedMethodback to summary
public static Method findBridgedMethod(Method bridgeMethod)

Find the original method for the supplied 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.

Parameters
bridgeMethod:Method

the bridge method

Returns:Method

the original method for the bridge

Exceptions
IllegalStateException:
if no bridged Method can be found
findGenericDeclarationback to summary
private static Method findGenericDeclaration(Method bridgeMethod)

Search for the generic Method declaration whose erased signature matches that of the supplied bridge method.

Exceptions
IllegalStateException:
if the generic declaration cannot be found
findMethodback to summary
private static Method findMethod(Class<?> clazz, String name, Class<?>[] paramTypes)

Attempt to find a 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.

Parameters
clazz:Class<?>

the class to introspect

name:String

the name of the method

paramTypes:Class<?>[]

the parameter types of the method

Returns:Method

the Method object, or null if none found

getAllDeclaredMethodsback to summary
private static Method[] getAllDeclaredMethods(Class<?> leafClass)

Get all declared methods on the leaf class and all superclasses. Leaf class methods are included first.

getAllInterfacesForClassback to summary
private static Class<?>[] getAllInterfacesForClass(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:Class<?>

the class to analyse for interfaces

Returns:Class<?>[]

all interfaces that the given object implements as array

getRawTypeback to summary
private static Type getRawType(Type genericType, Map<TypeVariable<?>, Type> typeVariableMap)

Determine the raw type for the given generic parameter type.

isBridgedCandidateForback to summary
private static boolean isBridgedCandidateFor(Method candidateMethod, 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. This method performs inexpensive checks and can be used quickly filter for a set of possible matches.

isBridgeMethodForback to summary
private static boolean isBridgeMethodFor(Method bridgeMethod, Method candidateMethod, Map<TypeVariable<?>, Type> typeVariableMap)

Determine whether or not the bridge Method is the bridge for the supplied candidate Method.

isResolvedTypeMatchback to summary
private static boolean isResolvedTypeMatch(Method genericMethod, Method candidateMethod, Map<TypeVariable<?>, 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.

populateTypeMapFromParameterizedTypeback to summary
private static void populateTypeMapFromParameterizedType(ParameterizedType type, Map<TypeVariable<?>, Type> typeVariableMap)

Read the TypeVariables from the supplied ParameterizedType and add mappings corresponding to the TypeVariable name -> concrete type to the supplied Map.

Consider this case:

Map: {S=java.lang.String, T=java.lang.Integer}.

searchCandidatesback to summary
private static Method searchCandidates(List<Method> candidateMethods, Method bridgeMethod)

Search for the bridged method in the given candidates.

Parameters
candidateMethods:List<Method>

the List of candidate Methods

bridgeMethod:Method

the bridge method

Returns:Method

the bridged method, or null if none found

searchForMatchback to summary
private static Method searchForMatch(Class<?> type, 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.