|
|
|
|
@ -19,12 +19,15 @@ package org.springframework.core.annotation;
@@ -19,12 +19,15 @@ package org.springframework.core.annotation;
|
|
|
|
|
import java.lang.annotation.Retention; |
|
|
|
|
import java.lang.annotation.RetentionPolicy; |
|
|
|
|
import java.lang.reflect.Method; |
|
|
|
|
import java.lang.reflect.Modifier; |
|
|
|
|
|
|
|
|
|
import org.junit.jupiter.api.Test; |
|
|
|
|
|
|
|
|
|
import org.springframework.core.MethodParameter; |
|
|
|
|
import org.springframework.util.ClassUtils; |
|
|
|
|
import org.springframework.util.ReflectionUtils; |
|
|
|
|
|
|
|
|
|
import static java.util.Arrays.stream; |
|
|
|
|
import static java.util.stream.Collectors.joining; |
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
@ -55,6 +58,12 @@ class AnnotatedMethodTests {
@@ -55,6 +58,12 @@ class AnnotatedMethodTests {
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void shouldFindAnnotationOnMethodParameterInGenericAbstractSuperclass() { |
|
|
|
|
// Prerequisites for gh-35349
|
|
|
|
|
Method abstractMethod = ReflectionUtils.findMethod(GenericAbstractSuperclass.class, "processTwo", Object.class); |
|
|
|
|
assertThat(abstractMethod).isNotNull(); |
|
|
|
|
assertThat(Modifier.isAbstract(abstractMethod.getModifiers())).as("abstract").isTrue(); |
|
|
|
|
assertThat(Modifier.isPublic(abstractMethod.getModifiers())).as("public").isFalse(); |
|
|
|
|
|
|
|
|
|
Method processTwo = getMethod("processTwo", String.class); |
|
|
|
|
|
|
|
|
|
AnnotatedMethod annotatedMethod = new AnnotatedMethod(processTwo); |
|
|
|
|
@ -78,7 +87,14 @@ class AnnotatedMethodTests {
@@ -78,7 +87,14 @@ class AnnotatedMethodTests {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static Method getMethod(String name, Class<?>...parameterTypes) { |
|
|
|
|
return ClassUtils.getMethod(GenericInterfaceImpl.class, name, parameterTypes); |
|
|
|
|
Class<?> clazz = GenericInterfaceImpl.class; |
|
|
|
|
Method method = ReflectionUtils.findMethod(clazz, name, parameterTypes); |
|
|
|
|
if (method == null) { |
|
|
|
|
String parameterNames = stream(parameterTypes).map(Class::getName).collect(joining(", ")); |
|
|
|
|
throw new IllegalStateException("Expected method not found: %s#%s(%s)" |
|
|
|
|
.formatted(clazz.getSimpleName(), name, parameterNames)); |
|
|
|
|
} |
|
|
|
|
return method; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -103,13 +119,14 @@ class AnnotatedMethodTests {
@@ -103,13 +119,14 @@ class AnnotatedMethodTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Handler |
|
|
|
|
public abstract void processTwo(@Param C value); |
|
|
|
|
// Intentionally NOT public
|
|
|
|
|
abstract void processTwo(@Param C value); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static class GenericInterfaceImpl extends GenericAbstractSuperclass<String> { |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void processTwo(String value) { |
|
|
|
|
void processTwo(String value) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|