Browse Source

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
pull/36549/head
Sam Brannen 4 days ago
parent
commit
5708b73ea9
  1. 1
      spring-core/src/main/java/org/springframework/core/MethodParameter.java
  2. 13
      spring-core/src/main/java/org/springframework/core/ResolvableType.java
  3. 24
      spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java

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

@ -822,6 +822,7 @@ public class MethodParameter { @@ -822,6 +822,7 @@ public class MethodParameter {
* @since 5.0
*/
public static MethodParameter forParameter(Parameter parameter) {
Assert.notNull(parameter, "Parameter must not be null");
return forExecutable(parameter.getDeclaringExecutable(), findParameterIndex(parameter));
}

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

@ -22,6 +22,7 @@ import java.lang.reflect.Constructor; @@ -22,6 +22,7 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
@ -1280,6 +1281,18 @@ public class ResolvableType implements Serializable { @@ -1280,6 +1281,18 @@ public class ResolvableType implements Serializable {
return forType(null, new FieldTypeProvider(field), owner.asVariableResolver()).getNested(nestingLevel);
}
/**
* Return a {@code ResolvableType} for the specified {@link Parameter}.
* <p>This is a convenience factory method for scenarios where a {@code Parameter}
* descriptor is already available.
* @param parameter the source parameter
* @return a {@code ResolvableType} for the specified parameter
* @since 7.1
*/
public static ResolvableType forParameter(Parameter parameter) {
return forMethodParameter(MethodParameter.forParameter(parameter));
}
/**
* Return a {@code ResolvableType} for the specified {@link Constructor} parameter.
* @param constructor the source constructor (must not be {@code null})

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

@ -25,6 +25,7 @@ import java.lang.reflect.Constructor; @@ -25,6 +25,7 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
@ -207,6 +208,29 @@ class ResolvableTypeTests { @@ -207,6 +208,29 @@ class ResolvableTypeTests {
.withMessage("Field must not be null");
}
@Test
void forParameterForMethod() throws Exception {
Method method = Methods.class.getMethod("charSequenceParameter", List.class);
Parameter parameter = method.getParameters()[0];
ResolvableType type = ResolvableType.forParameter(parameter);
assertThat(type.getType()).isEqualTo(method.getGenericParameterTypes()[0]);
}
@Test
void forParameterForConstructor() throws Exception {
Constructor<Constructors> constructor = Constructors.class.getConstructor(List.class);
Parameter parameter = constructor.getParameters()[0];
ResolvableType type = ResolvableType.forParameter(parameter);
assertThat(type.getType()).isEqualTo(constructor.getGenericParameterTypes()[0]);
}
@Test
void forParameterMustNotBeNull() {
assertThatIllegalArgumentException()
.isThrownBy(() -> ResolvableType.forParameter(null))
.withMessage("Parameter must not be null");
}
@Test
void forConstructorParameter() throws Exception {
Constructor<Constructors> constructor = Constructors.class.getConstructor(List.class);

Loading…
Cancel
Save