From 5656eaccb7245b8a3799529bc774dee907ece4d1 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 23 Jan 2024 10:50:53 +0100 Subject: [PATCH] Avoid bridge resolution for method from unrelated class hierarchy Closes gh-32087 --- .../core/BridgeMethodResolver.java | 4 ++++ .../core/BridgeMethodResolverTests.java | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/spring-core/src/main/java/org/springframework/core/BridgeMethodResolver.java b/spring-core/src/main/java/org/springframework/core/BridgeMethodResolver.java index f8bbfbf78fb..f399f3e270c 100644 --- a/spring-core/src/main/java/org/springframework/core/BridgeMethodResolver.java +++ b/spring-core/src/main/java/org/springframework/core/BridgeMethodResolver.java @@ -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())); diff --git a/spring-core/src/test/java/org/springframework/core/BridgeMethodResolverTests.java b/spring-core/src/test/java/org/springframework/core/BridgeMethodResolverTests.java index 449d886d920..c6fb5dc4444 100644 --- a/spring-core/src/test/java/org/springframework/core/BridgeMethodResolverTests.java +++ b/spring-core/src/test/java/org/springframework/core/BridgeMethodResolverTests.java @@ -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 { public class Enclosed {