org.springframework.core
Class BridgeMethodResolver

java.lang.Object
  extended by org.springframework.core.BridgeMethodResolver

public abstract class BridgeMethodResolver
extends java.lang.Object

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.

Since:
2.0
Author:
Rob Harrop, Juergen Hoeller

Constructor Summary
BridgeMethodResolver()
           
 
Method Summary
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)
          Searches for the generic Method declaration whose erased signature matches that of the supplied bridge method.
private static boolean isBridgedCandidateFor(java.lang.reflect.Method candidateMethod, java.lang.reflect.Method bridgeMethod)
          Returns true if the supplied 'candidateMethod' can be consider a validate candidate for the Method that is bridged by the supplied bridge Method.
(package 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)
          Determines whether or not the bridge Method is the bridge for the supplied candidate Method.
static boolean isJava6VisibilityBridgeMethodPair(java.lang.reflect.Method bridgeMethod, java.lang.reflect.Method bridgedMethod)
          Compare the signatures of the bridge method and the method which it bridges.
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)
          Returns 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.Method searchCandidates(java.util.List<java.lang.reflect.Method> candidateMethods, java.lang.reflect.Method bridgeMethod)
          Searches 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.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

BridgeMethodResolver

public BridgeMethodResolver()
Method Detail

findBridgedMethod

public static java.lang.reflect.Method findBridgedMethod(java.lang.reflect.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 method to introspect
Returns:
the original method (either the bridged method or the passed-in method if no more specific one could be found)

searchCandidates

private static java.lang.reflect.Method searchCandidates(java.util.List<java.lang.reflect.Method> candidateMethods,
                                                         java.lang.reflect.Method bridgeMethod)
Searches 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(java.lang.reflect.Method candidateMethod,
                                             java.lang.reflect.Method bridgeMethod)
Returns 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

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)
Determines whether or not the bridge Method is the bridge for the supplied candidate Method.


findGenericDeclaration

private static java.lang.reflect.Method findGenericDeclaration(java.lang.reflect.Method bridgeMethod)
Searches for the generic Method declaration whose erased signature matches that of the supplied bridge method.

Throws:
java.lang.IllegalStateException - if the generic declaration cannot be found

isResolvedTypeMatch

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)
Returns 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.


searchForMatch

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.


isJava6VisibilityBridgeMethodPair

public static boolean isJava6VisibilityBridgeMethodPair(java.lang.reflect.Method bridgeMethod,
                                                        java.lang.reflect.Method bridgedMethod)
Compare the signatures of the bridge method and the method which it bridges. If the parameter and return types are the same, it is a 'visibility' bridge method introduced in Java 6 to fix http://bugs.sun.com/view_bug.do?bug_id=6342411. See also http://stas-blogspot.blogspot.com/2010/03/java-bridge-methods-explained.html

Returns:
whether signatures match as described