ResolvableType-based type matching at the BeanFactory API level
Issue: SPR-12147
This commit is contained in:
@@ -156,7 +156,7 @@ public final class ResolvableType implements Serializable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the underlying Java {@link Class} being managed, if available;
|
||||
* Return the underlying Java {@link Class} being managed, if available;
|
||||
* otherwise {@code null}.
|
||||
*/
|
||||
public Class<?> getRawClass() {
|
||||
@@ -179,6 +179,27 @@ public final class ResolvableType implements Serializable {
|
||||
return (source != null ? source : this.type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the given object is an instance of this {@code ResolvableType}.
|
||||
* @param obj the object to check
|
||||
* @since 4.2
|
||||
* @see #isAssignableFrom(Class)
|
||||
*/
|
||||
public boolean isInstance(Object obj) {
|
||||
return (obj != null && isAssignableFrom(obj.getClass()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether this {@code ResolvableType} is assignable from the
|
||||
* specified other type.
|
||||
* @param other the type to be checked against (as a {@code Class})
|
||||
* @since 4.2
|
||||
* @see #isAssignableFrom(ResolvableType)
|
||||
*/
|
||||
public boolean isAssignableFrom(Class<?> other) {
|
||||
return isAssignableFrom(forClass(other), null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether this {@code ResolvableType} is assignable from the
|
||||
* specified other type.
|
||||
@@ -186,7 +207,7 @@ public final class ResolvableType implements Serializable {
|
||||
* whether both the {@link #resolve() resolved} {@code Class} is
|
||||
* {@link Class#isAssignableFrom(Class) assignable from} the given type
|
||||
* as well as whether all {@link #getGenerics() generics} are assignable.
|
||||
* @param other the type to be checked against
|
||||
* @param other the type to be checked against (as a {@code ResolvableType})
|
||||
* @return {@code true} if the specified other type can be assigned to this
|
||||
* {@code ResolvableType}; {@code false} otherwise
|
||||
*/
|
||||
|
||||
@@ -61,6 +61,7 @@ import static org.mockito.BDDMockito.*;
|
||||
* Tests for {@link ResolvableType}.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
* @author Juergen Hoeller
|
||||
*/
|
||||
@SuppressWarnings("rawtypes")
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
@@ -882,7 +883,7 @@ public class ResolvableTypeTests {
|
||||
public void isAssignableFromMustNotBeNull() throws Exception {
|
||||
this.thrown.expect(IllegalArgumentException.class);
|
||||
this.thrown.expectMessage("Type must not be null");
|
||||
ResolvableType.forClass(Object.class).isAssignableFrom(null);
|
||||
ResolvableType.forClass(Object.class).isAssignableFrom((ResolvableType) null);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -901,6 +902,20 @@ public class ResolvableTypeTests {
|
||||
assertAssignable(objectType, objectType, charSequenceType, stringType).equalTo(true, true, true);
|
||||
assertAssignable(charSequenceType, objectType, charSequenceType, stringType).equalTo(false, true, true);
|
||||
assertAssignable(stringType, objectType, charSequenceType, stringType).equalTo(false, false, true);
|
||||
|
||||
assertTrue(objectType.isAssignableFrom(String.class));
|
||||
assertTrue(objectType.isAssignableFrom(StringBuilder.class));
|
||||
assertTrue(charSequenceType.isAssignableFrom(String.class));
|
||||
assertTrue(charSequenceType.isAssignableFrom(StringBuilder.class));
|
||||
assertTrue(stringType.isAssignableFrom(String.class));
|
||||
assertFalse(stringType.isAssignableFrom(StringBuilder.class));
|
||||
|
||||
assertTrue(objectType.isInstance("a String"));
|
||||
assertTrue(objectType.isInstance(new StringBuilder("a StringBuilder")));
|
||||
assertTrue(charSequenceType.isInstance("a String"));
|
||||
assertTrue(charSequenceType.isInstance(new StringBuilder("a StringBuilder")));
|
||||
assertTrue(stringType.isInstance("a String"));
|
||||
assertFalse(stringType.isInstance(new StringBuilder("a StringBuilder")));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user