Class BridgeMethodResolver
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.
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprivate static Map<TypeVariable<?>,Type> createTypeVariableMap(Class<?> cls) private static Class<?>extractClassForTypeVariable(TypeVariable<?> typeVariable) Extracts the bound 'Class' for a giveTypeVariable.private static voidextractTypeVariablesFromGenericInterfaces(Type[] genericInterfaces, Map<TypeVariable<?>, Type> typeVariableMap) static MethodfindBridgedMethod(Method bridgeMethod) Find the original method for the suppliedbridge Method.private static MethodfindGenericDeclaration(Method bridgeMethod) Search for the genericMethoddeclaration whose erased signature matches that of the supplied bridge method.private static MethodfindMethod(Class<?> clazz, String name, Class<?>[] paramTypes) Attempt to find aMethodon 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<?>[]getAllInterfacesForClass(Class<?> clazz) Return all interfaces that the given class implements as array, including ones implemented by superclasses.private static TypegetRawType(Type genericType, Map<TypeVariable<?>, Type> typeVariableMap) Determine the raw type for the given generic parameter type.private static booleanisBridgedCandidateFor(Method candidateMethod, Method bridgeMethod) Returntrueif the supplied 'candidateMethod' can be consider a validate candidate for theMethodthat isbridgedby the suppliedbridge Method.private static booleanisBridgeMethodFor(Method bridgeMethod, Method candidateMethod, Map<TypeVariable<?>, Type> typeVariableMap) private static booleanisResolvedTypeMatch(Method genericMethod, Method candidateMethod, Map<TypeVariable<?>, Type> typeVariableMap) Returntrueif theTypesignature of both the suppliedgeneric Methodand concreteMethodare equal after resolving allTypeVariablesusing the suppliedTypeVariable Map, otherwise returnsfalse.private static voidpopulateTypeMapFromParameterizedType(ParameterizedType type, Map<TypeVariable<?>, Type> typeVariableMap) Read theTypeVariablesfrom the suppliedParameterizedTypeand add mappings corresponding to theTypeVariable name-> concrete type to the suppliedMap.private static MethodsearchCandidates(List<Method> candidateMethods, Method bridgeMethod) Search for the bridged method in the given candidates.private static MethodsearchForMatch(Class<?> type, Method bridgeMethod)
-
Constructor Details
-
BridgeMethodResolver
private BridgeMethodResolver()
-
-
Method Details
-
findBridgedMethod
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:
IllegalStateException- if no bridgedMethodcan be found
-
searchCandidates
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
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(Method bridgeMethod, Method candidateMethod, Map<TypeVariable<?>, Type> typeVariableMap) -
findGenericDeclaration
Search for the genericMethoddeclaration whose erased signature matches that of the supplied bridge method.- Throws:
IllegalStateException- if the generic declaration cannot be found
-
isResolvedTypeMatch
private static boolean isResolvedTypeMatch(Method genericMethod, Method candidateMethod, Map<TypeVariable<?>, Type> typeVariableMap) Returntrueif theTypesignature of both the suppliedgeneric Methodand concreteMethodare equal after resolving allTypeVariablesusing the suppliedTypeVariable Map, otherwise returnsfalse. -
getRawType
Determine the raw type for the given generic parameter type. -
searchForMatch
-
createTypeVariableMap
Build a mapping ofTypeVariable namesto concreteClassfor the specifiedClass. Searches all super types, enclosing types and interfaces. -
extractTypeVariablesFromGenericInterfaces
private static void extractTypeVariablesFromGenericInterfaces(Type[] genericInterfaces, Map<TypeVariable<?>, Type> typeVariableMap) -
populateTypeMapFromParameterizedType
private static void populateTypeMapFromParameterizedType(ParameterizedType type, Map<TypeVariable<?>, Type> typeVariableMap) Read theTypeVariablesfrom the suppliedParameterizedTypeand add mappings corresponding to theTypeVariable name-> concrete type to the suppliedMap.Consider this case: <pre class="code> public interface Foo<S, T> { .. } public class FooImpl implements Foo<String, Integer> { .. } For '
FooImpl' the following mappings would be added to theMap: {S=java.lang.String, T=java.lang.Integer}. -
extractClassForTypeVariable
Extracts the bound 'Class' for a giveTypeVariable. -
getAllInterfacesForClass
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
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
Get all declared methods on the leaf class and all superclasses. Leaf class methods are included first.
-