Class BridgeMethodResolver

java.lang.Object
org.easymock.internal.BridgeMethodResolver

public final class BridgeMethodResolver extends Object
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.

  • Constructor Details

    • BridgeMethodResolver

      private BridgeMethodResolver()
  • Method Details

    • findBridgedMethod

      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 - the bridge method
      Returns:
      the original method for the bridge
      Throws:
      IllegalStateException - if no bridged Method can be found
    • searchCandidates

      private static Method searchCandidates(List<Method> candidateMethods, Method bridgeMethod)
      Search for the bridged method in the given candidates.
      Parameters:
      candidateMethods - the List of candidate Methods
      bridgeMethod - the bridge method
      Returns:
      the bridged method, or null if none found
    • isBridgedCandidateFor

      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.
    • isBridgeMethodFor

      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.
    • findGenericDeclaration

      private static Method findGenericDeclaration(Method bridgeMethod)
      Search for the generic Method 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)
      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.
    • getRawType

      private static Type getRawType(Type genericType, Map<TypeVariable<?>,Type> typeVariableMap)
      Determine the raw type for the given generic parameter type.
    • searchForMatch

      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.
    • createTypeVariableMap

      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.
    • extractTypeVariablesFromGenericInterfaces

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

      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: invalid input: '<'pre class="code> public interface Foo<S, T> { .. } public class FooImpl implements Foo<String, Integer> { .. } For 'FooImpl' the following mappings would be added to the Map: {S=java.lang.String, T=java.lang.Integer}.

    • extractClassForTypeVariable

      private static Class<?> extractClassForTypeVariable(TypeVariable<?> typeVariable)
      Extracts the bound 'Class' for a give TypeVariable.
    • getAllInterfacesForClass

      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 - the class to analyse for interfaces
      Returns:
      all interfaces that the given object implements as array
    • findMethod

      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 - the class to introspect
      name - the name of the method
      paramTypes - the parameter types of the method
      Returns:
      the Method object, or null if none found
    • getAllDeclaredMethods

      private static Method[] getAllDeclaredMethods(Class<?> leafClass)
      Get all declared methods on the leaf class and all superclasses. Leaf class methods are included first.