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 void
extractTypeVariablesFromGenericInterfaces
(Type[] genericInterfaces, Map<TypeVariable<?>, Type> typeVariableMap) static Method
findBridgedMethod
(Method bridgeMethod) Find the original method for the suppliedbridge Method
.private static Method
findGenericDeclaration
(Method bridgeMethod) Search for the genericMethod
declaration whose erased signature matches that of the supplied bridge method.private static Method
findMethod
(Class<?> clazz, String name, Class<?>[] paramTypes) Attempt to find aMethod
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<?>[]
getAllInterfacesForClass
(Class<?> 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) Returntrue
if the supplied 'candidateMethod
' can be consider a validate candidate for theMethod
that isbridged
by the suppliedbridge Method
.private static boolean
isBridgeMethodFor
(Method bridgeMethod, Method candidateMethod, Map<TypeVariable<?>, Type> typeVariableMap) private static boolean
isResolvedTypeMatch
(Method genericMethod, Method candidateMethod, Map<TypeVariable<?>, 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
(ParameterizedType type, Map<TypeVariable<?>, Type> typeVariableMap) Read theTypeVariables
from the suppliedParameterizedType
and add mappings corresponding to theTypeVariable name
-> concrete type to the suppliedMap
.private static Method
searchCandidates
(List<Method> candidateMethods, Method bridgeMethod) Search for the bridged method in the given candidates.private static Method
searchForMatch
(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
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:
IllegalStateException
- if no bridgedMethod
can 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
null
if none found
-
isBridgedCandidateFor
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(Method bridgeMethod, Method candidateMethod, Map<TypeVariable<?>, Type> typeVariableMap) -
findGenericDeclaration
Search for the genericMethod
declaration 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) Returntrue
if theType
signature of both the suppliedgeneric Method
and concreteMethod
are equal after resolving allTypeVariables
using the suppliedTypeVariable Map
, otherwise returnsfalse
. -
getRawType
Determine the raw type for the given generic parameter type. -
searchForMatch
-
createTypeVariableMap
Build a mapping ofTypeVariable names
to concreteClass
for 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 theTypeVariables
from the suppliedParameterizedType
and 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 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
Get all declared methods on the leaf class and all superclasses. Leaf class methods are included first.
-