Avoid bridge resolution for method from unrelated class hierarchy

Closes gh-32087
This commit is contained in:
Juergen Hoeller
2024-01-23 10:50:53 +01:00
parent 3b2f6e74a6
commit 5656eaccb7
2 changed files with 19 additions and 0 deletions

View File

@@ -86,6 +86,10 @@ public final class BridgeMethodResolver {
* @see org.springframework.util.ClassUtils#getMostSpecificMethod
*/
public static Method getMostSpecificMethod(Method bridgeMethod, @Nullable Class<?> targetClass) {
if (targetClass != null && !bridgeMethod.getDeclaringClass().isAssignableFrom(targetClass)) {
return bridgeMethod;
}
Method specificMethod = ClassUtils.getMostSpecificMethod(bridgeMethod, targetClass);
return resolveBridgeMethod(specificMethod,
(targetClass != null ? targetClass : specificMethod.getDeclaringClass()));

View File

@@ -38,6 +38,7 @@ import static org.assertj.core.api.Assertions.assertThat;
* @author Rob Harrop
* @author Juergen Hoeller
* @author Chris Beams
* @author Yanming Zhou
*/
@SuppressWarnings("rawtypes")
class BridgeMethodResolverTests {
@@ -97,6 +98,13 @@ class BridgeMethodResolverTests {
assertThat(bridgedMethod.getParameterTypes()[0]).isEqualTo(Date.class);
}
@Test
void findBridgedMethodFromOriginalMethodNotInHierarchy() throws Exception {
Method originalMethod = Adder.class.getMethod("add", Object.class);
Method mostSpecificMethod = BridgeMethodResolver.getMostSpecificMethod(originalMethod, FakeAdder.class);
assertThat(mostSpecificMethod).isSameAs(originalMethod);
}
@Test
void isBridgeMethodFor() throws Exception {
Method bridged = MyBar.class.getDeclaredMethod("someMethod", String.class, Object.class);
@@ -406,6 +414,13 @@ class BridgeMethodResolverTests {
}
public static class FakeAdder {
public void add(Date date) {
}
}
public static class Enclosing<T> {
public class Enclosed<S> {