public final class BridgeMethodResolver
extends java.lang.Object
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.
| Modifier | Constructor and Description |
|---|---|
private |
BridgeMethodResolver() |
| Modifier and Type | Method and Description |
|---|---|
private static java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> |
createTypeVariableMap(java.lang.Class<?> cls)
Build a mapping of
TypeVariable names to
concrete Class for the specified Class. |
private static java.lang.Class<?> |
extractClassForTypeVariable(java.lang.reflect.TypeVariable<?> typeVariable)
Extracts the bound '
Class' for a give TypeVariable. |
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 supplied
bridge Method. |
private static java.lang.reflect.Method |
findGenericDeclaration(java.lang.reflect.Method bridgeMethod)
Search for the generic
Method 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 a
Method 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)
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(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 bridge
Method is the bridge for the
supplied candidate Method. |
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)
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(java.lang.reflect.ParameterizedType type,
java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.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 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 supplied
Class has a declared Method whose
signature matches that of the supplied Method, then this matching
Method is returned, otherwise null is returned. |
public static java.lang.reflect.Method findBridgedMethod(java.lang.reflect.Method bridgeMethod)
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.
bridgeMethod - the bridge methodjava.lang.IllegalStateException - if no bridged Method can be foundprivate static java.lang.reflect.Method searchCandidates(java.util.List<java.lang.reflect.Method> candidateMethods,
java.lang.reflect.Method bridgeMethod)
candidateMethods - the List of candidate MethodsbridgeMethod - the bridge methodnull if none foundprivate static boolean isBridgedCandidateFor(java.lang.reflect.Method candidateMethod,
java.lang.reflect.Method bridgeMethod)
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.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)
Method is the bridge for the
supplied candidate Method.private static java.lang.reflect.Method findGenericDeclaration(java.lang.reflect.Method bridgeMethod)
Method declaration whose erased signature
matches that of the supplied bridge method.java.lang.IllegalStateException - if the generic declaration cannot be foundprivate 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)
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 java.lang.reflect.Type getRawType(java.lang.reflect.Type genericType,
java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> typeVariableMap)
private static java.lang.reflect.Method searchForMatch(java.lang.Class<?> type,
java.lang.reflect.Method bridgeMethod)
Class has a declared Method whose
signature matches that of the supplied Method, then this matching
Method is returned, otherwise null is returned.private static java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> createTypeVariableMap(java.lang.Class<?> cls)
TypeVariable names to
concrete Class for the specified Class. Searches all
super types, enclosing types and interfaces.private static void extractTypeVariablesFromGenericInterfaces(java.lang.reflect.Type[] genericInterfaces,
java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> typeVariableMap)
private static void populateTypeMapFromParameterizedType(java.lang.reflect.ParameterizedType type,
java.util.Map<java.lang.reflect.TypeVariable<?>,java.lang.reflect.Type> typeVariableMap)
TypeVariables from the supplied
ParameterizedType and add mappings corresponding to the
TypeVariable name -> concrete type to the
supplied Map.
Consider this case:
private static java.lang.Class<?> extractClassForTypeVariable(java.lang.reflect.TypeVariable<?> typeVariable)
Class' for a give TypeVariable.private static java.lang.Class<?>[] getAllInterfacesForClass(java.lang.Class<?> clazz)
If the class itself is an interface, it gets returned as sole interface.
clazz - the class to analyse for interfacesprivate static java.lang.reflect.Method findMethod(java.lang.Class<?> clazz,
java.lang.String name,
java.lang.Class<?>[] paramTypes)
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.
clazz - the class to introspectname - the name of the methodparamTypes - the parameter types of the methodnull if none foundprivate static java.lang.reflect.Method[] getAllDeclaredMethods(java.lang.Class<?> leafClass)