Skip to content

Commit 5708b73

Browse files
committed
Introduce ResolvableType.forParameter() factory method
Prior to this commit, one could invoke ResolvableType.forMethodParameter(MethodParameter.forParameter(parameter)) to create a ResolvableType for a Parameter; however, that's slightly cumbersome. To address that, this commit introduces ResolvableType.forParameter(), analogous to existing convenience factory methods in ResolvableType. Closes gh-36545
1 parent 5e975f5 commit 5708b73

File tree

3 files changed

+38
-0
lines changed

3 files changed

+38
-0
lines changed

spring-core/src/main/java/org/springframework/core/MethodParameter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -822,6 +822,7 @@ else if (executable instanceof Constructor<?> constructor) {
822822
* @since 5.0
823823
*/
824824
public static MethodParameter forParameter(Parameter parameter) {
825+
Assert.notNull(parameter, "Parameter must not be null");
825826
return forExecutable(parameter.getDeclaringExecutable(), findParameterIndex(parameter));
826827
}
827828

spring-core/src/main/java/org/springframework/core/ResolvableType.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.lang.reflect.Field;
2323
import java.lang.reflect.GenericArrayType;
2424
import java.lang.reflect.Method;
25+
import java.lang.reflect.Parameter;
2526
import java.lang.reflect.ParameterizedType;
2627
import java.lang.reflect.Type;
2728
import java.lang.reflect.TypeVariable;
@@ -1280,6 +1281,18 @@ public static ResolvableType forField(Field field, int nestingLevel, @Nullable C
12801281
return forType(null, new FieldTypeProvider(field), owner.asVariableResolver()).getNested(nestingLevel);
12811282
}
12821283

1284+
/**
1285+
* Return a {@code ResolvableType} for the specified {@link Parameter}.
1286+
* <p>This is a convenience factory method for scenarios where a {@code Parameter}
1287+
* descriptor is already available.
1288+
* @param parameter the source parameter
1289+
* @return a {@code ResolvableType} for the specified parameter
1290+
* @since 7.1
1291+
*/
1292+
public static ResolvableType forParameter(Parameter parameter) {
1293+
return forMethodParameter(MethodParameter.forParameter(parameter));
1294+
}
1295+
12831296
/**
12841297
* Return a {@code ResolvableType} for the specified {@link Constructor} parameter.
12851298
* @param constructor the source constructor (must not be {@code null})

spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.lang.reflect.Field;
2626
import java.lang.reflect.GenericArrayType;
2727
import java.lang.reflect.Method;
28+
import java.lang.reflect.Parameter;
2829
import java.lang.reflect.ParameterizedType;
2930
import java.lang.reflect.Type;
3031
import java.lang.reflect.TypeVariable;
@@ -207,6 +208,29 @@ void forFieldMustNotBeNull() {
207208
.withMessage("Field must not be null");
208209
}
209210

211+
@Test
212+
void forParameterForMethod() throws Exception {
213+
Method method = Methods.class.getMethod("charSequenceParameter", List.class);
214+
Parameter parameter = method.getParameters()[0];
215+
ResolvableType type = ResolvableType.forParameter(parameter);
216+
assertThat(type.getType()).isEqualTo(method.getGenericParameterTypes()[0]);
217+
}
218+
219+
@Test
220+
void forParameterForConstructor() throws Exception {
221+
Constructor<Constructors> constructor = Constructors.class.getConstructor(List.class);
222+
Parameter parameter = constructor.getParameters()[0];
223+
ResolvableType type = ResolvableType.forParameter(parameter);
224+
assertThat(type.getType()).isEqualTo(constructor.getGenericParameterTypes()[0]);
225+
}
226+
227+
@Test
228+
void forParameterMustNotBeNull() {
229+
assertThatIllegalArgumentException()
230+
.isThrownBy(() -> ResolvableType.forParameter(null))
231+
.withMessage("Parameter must not be null");
232+
}
233+
210234
@Test
211235
void forConstructorParameter() throws Exception {
212236
Constructor<Constructors> constructor = Constructors.class.getConstructor(List.class);

0 commit comments

Comments
 (0)