Skip to content

Commit 901d48c

Browse files
committed
Support for ResolvableType.getType().getTypeName() on Java 8
Issue: SPR-16535 (cherry picked from commit 6663d0f)
1 parent 0bc7c47 commit 901d48c

File tree

2 files changed

+50
-33
lines changed

2 files changed

+50
-33
lines changed

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

+18
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springframework.core.SerializableTypeWrapper.FieldTypeProvider;
3535
import org.springframework.core.SerializableTypeWrapper.MethodParameterTypeProvider;
3636
import org.springframework.core.SerializableTypeWrapper.TypeProvider;
37+
import org.springframework.lang.UsesJava8;
3738
import org.springframework.util.Assert;
3839
import org.springframework.util.ClassUtils;
3940
import org.springframework.util.ConcurrentReferenceHashMap;
@@ -1454,6 +1455,23 @@ public SyntheticParameterizedType(Type rawType, Type[] typeArguments) {
14541455
this.typeArguments = typeArguments;
14551456
}
14561457

1458+
@Override // on Java 8
1459+
@UsesJava8
1460+
public String getTypeName() {
1461+
StringBuilder result = new StringBuilder(this.rawType.getTypeName());
1462+
if (this.typeArguments.length > 0) {
1463+
result.append('<');
1464+
for (int i = 0; i < this.typeArguments.length; i++) {
1465+
if (i > 0) {
1466+
result.append(", ");
1467+
}
1468+
result.append(this.typeArguments[i].getTypeName());
1469+
}
1470+
result.append('>');
1471+
}
1472+
return result.toString();
1473+
}
1474+
14571475
@Override
14581476
public Type getOwnerType() {
14591477
return null;

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

+32-33
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2017 the original author or authors.
2+
* Copyright 2002-2018 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -42,7 +42,6 @@
4242
import java.util.TreeSet;
4343
import java.util.concurrent.Callable;
4444

45-
import org.hamcrest.Matchers;
4645
import org.junit.Rule;
4746
import org.junit.Test;
4847
import org.junit.rules.ExpectedException;
@@ -927,16 +926,6 @@ public void getSource() throws Exception {
927926
assertThat(ResolvableType.forClass(classType).getSuperType().getSource(), equalTo((Object) classType.getGenericSuperclass()));
928927
}
929928

930-
private void assertFieldToStringValue(String field, String expected) throws Exception {
931-
ResolvableType type = ResolvableType.forField(Fields.class.getField(field));
932-
assertThat("field " + field + " toString", type.toString(), equalTo(expected));
933-
}
934-
935-
private void assertTypedFieldToStringValue(String field, String expected) throws Exception {
936-
ResolvableType type = ResolvableType.forField(Fields.class.getField(field), TypedFields.class);
937-
assertThat("field " + field + " toString", type.toString(), equalTo(expected));
938-
}
939-
940929
@Test
941930
public void resolveFromOuterClass() throws Exception {
942931
Field field = EnclosedInParameterizedType.InnerTyped.class.getField("field");
@@ -954,7 +943,6 @@ public void resolveFromClassWithGenerics() throws Exception {
954943
assertThat(type.asCollection().getGeneric().getGeneric().resolve(), equalTo((Type) String.class));
955944
}
956945

957-
958946
@Test
959947
public void isAssignableFromMustNotBeNull() throws Exception {
960948
this.thrown.expect(IllegalArgumentException.class);
@@ -1189,25 +1177,25 @@ public void hashCodeAndEquals() throws Exception {
11891177
assertThat(forFieldDirect, not(equalTo(forFieldWithImplementation)));
11901178
}
11911179

1192-
@SuppressWarnings("unused")
1193-
private HashMap<Integer, List<String>> myMap;
1194-
11951180
@Test
11961181
public void javaDocSample() throws Exception {
11971182
ResolvableType t = ResolvableType.forField(getClass().getDeclaredField("myMap"));
1183+
assertThat(t.toString(), equalTo("java.util.HashMap<java.lang.Integer, java.util.List<java.lang.String>>"));
1184+
assertThat(t.getType().getTypeName(), equalTo("java.util.HashMap<java.lang.Integer, java.util.List<java.lang.String>>"));
11981185
assertThat(t.getSuperType().toString(), equalTo("java.util.AbstractMap<java.lang.Integer, java.util.List<java.lang.String>>"));
11991186
assertThat(t.asMap().toString(), equalTo("java.util.Map<java.lang.Integer, java.util.List<java.lang.String>>"));
1200-
assertThat(t.getGeneric(0).resolve(), equalTo((Class)Integer.class));
1201-
assertThat(t.getGeneric(1).resolve(), equalTo((Class)List.class));
1187+
assertThat(t.getGeneric(0).resolve(), equalTo(Integer.class));
1188+
assertThat(t.getGeneric(1).resolve(), equalTo(List.class));
12021189
assertThat(t.getGeneric(1).toString(), equalTo("java.util.List<java.lang.String>"));
1203-
assertThat(t.resolveGeneric(1, 0), equalTo((Class) String.class));
1190+
assertThat(t.resolveGeneric(1, 0), equalTo(String.class));
12041191
}
12051192

12061193
@Test
12071194
public void forClassWithGenerics() throws Exception {
12081195
ResolvableType elementType = ResolvableType.forClassWithGenerics(Map.class, Integer.class, String.class);
12091196
ResolvableType listType = ResolvableType.forClassWithGenerics(List.class, elementType);
12101197
assertThat(listType.toString(), equalTo("java.util.List<java.util.Map<java.lang.Integer, java.lang.String>>"));
1198+
assertThat(listType.getType().getTypeName(), equalTo("java.util.List<java.util.Map<java.lang.Integer, java.lang.String>>"));
12111199
}
12121200

12131201
@Test
@@ -1228,7 +1216,7 @@ public void forArrayComponent() throws Exception {
12281216
ResolvableType elementType = ResolvableType.forField(Fields.class.getField("stringList"));
12291217
ResolvableType type = ResolvableType.forArrayComponent(elementType);
12301218
assertThat(type.toString(), equalTo("java.util.List<java.lang.String>[]"));
1231-
assertThat(type.resolve(), equalTo((Class) List[].class));
1219+
assertThat(type.resolve(), equalTo(List[].class));
12321220
}
12331221

12341222
@Test
@@ -1248,14 +1236,14 @@ public void serialize() throws Exception {
12481236
@Test
12491237
public void canResolveVoid() throws Exception {
12501238
ResolvableType type = ResolvableType.forClass(void.class);
1251-
assertThat(type.resolve(), equalTo((Class) void.class));
1239+
assertThat(type.resolve(), equalTo(void.class));
12521240
}
12531241

12541242
@Test
12551243
public void narrow() throws Exception {
12561244
ResolvableType type = ResolvableType.forField(Fields.class.getField("stringList"));
12571245
ResolvableType narrow = ResolvableType.forType(ArrayList.class, type);
1258-
assertThat(narrow.getGeneric().resolve(), equalTo((Class) String.class));
1246+
assertThat(narrow.getGeneric().resolve(), equalTo(String.class));
12591247
}
12601248

12611249
@Test
@@ -1330,23 +1318,30 @@ private ResolvableType testSerialization(ResolvableType type) throws Exception {
13301318
ResolvableType read = (ResolvableType) ois.readObject();
13311319
assertThat(read, equalTo(type));
13321320
assertThat(read.getType(), equalTo(type.getType()));
1333-
assertThat(read.resolve(), equalTo((Class) type.resolve()));
1321+
assertThat(read.resolve(), equalTo(type.resolve()));
13341322
return read;
13351323
}
13361324

1337-
private static AssertAssignbleMatcher assertAssignable(final ResolvableType type, final ResolvableType... fromTypes) {
1338-
return new AssertAssignbleMatcher() {
1339-
@Override
1340-
public void equalTo(boolean... values) {
1341-
for (int i = 0; i < fromTypes.length; i++) {
1342-
assertThat(stringDesc(type) + " isAssignableFrom " + stringDesc(fromTypes[i]),
1343-
type.isAssignableFrom(fromTypes[i]), Matchers.equalTo(values[i]));
1344-
}
1325+
private void assertFieldToStringValue(String field, String expected) throws Exception {
1326+
ResolvableType type = ResolvableType.forField(Fields.class.getField(field));
1327+
assertThat("field " + field + " toString", type.toString(), equalTo(expected));
1328+
}
1329+
1330+
private void assertTypedFieldToStringValue(String field, String expected) throws Exception {
1331+
ResolvableType type = ResolvableType.forField(Fields.class.getField(field), TypedFields.class);
1332+
assertThat("field " + field + " toString", type.toString(), equalTo(expected));
1333+
}
1334+
1335+
private AssertAssignbleMatcher assertAssignable(final ResolvableType type, final ResolvableType... fromTypes) {
1336+
return values -> {
1337+
for (int i = 0; i < fromTypes.length; i++) {
1338+
assertThat(stringDesc(type) + " isAssignableFrom " + stringDesc(fromTypes[i]),
1339+
type.isAssignableFrom(fromTypes[i]), equalTo(values[i]));
13451340
}
13461341
};
13471342
}
13481343

1349-
private static String stringDesc(ResolvableType type) {
1344+
private String stringDesc(ResolvableType type) {
13501345
if (type == ResolvableType.NONE) {
13511346
return "NONE";
13521347
}
@@ -1357,7 +1352,11 @@ private static String stringDesc(ResolvableType type) {
13571352
}
13581353

13591354

1360-
private static interface AssertAssignbleMatcher {
1355+
@SuppressWarnings("unused")
1356+
private HashMap<Integer, List<String>> myMap;
1357+
1358+
1359+
private interface AssertAssignbleMatcher {
13611360

13621361
void equalTo(boolean... values);
13631362
}

0 commit comments

Comments
 (0)