Skip to content

Commit b8d71e1

Browse files
authored
fix: map type error (#260)
1 parent c3a1a08 commit b8d71e1

File tree

2 files changed

+52
-4
lines changed

2 files changed

+52
-4
lines changed

arex-instrumentation-api/src/main/java/io/arex/inst/runtime/util/TypeUtil.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.arex.inst.runtime.log.LogManager;
77

88
import java.lang.reflect.Field;
9+
import java.lang.reflect.TypeVariable;
910
import java.util.Collection;
1011
import java.util.Map;
1112
import java.util.Optional;
@@ -229,17 +230,31 @@ private static String optionalToString(Optional<?> result) {
229230
}
230231

231232
private static String mapToString(Map<?, ?> result) {
232-
if (result.size() < 1) {
233+
if (result.isEmpty()) {
233234
return result.getClass().getName();
234235
}
236+
237+
String resultClassName = result.getClass().getName();
238+
final TypeVariable<?>[] typeParameters = result.getClass().getTypeParameters();
239+
if (ArrayUtils.isEmpty(typeParameters)) {
240+
return resultClassName;
241+
}
235242
StringBuilder builder = new StringBuilder();
236-
builder.append(result.getClass().getName()).append(HORIZONTAL_LINE);
243+
builder.append(resultClassName).append(HORIZONTAL_LINE);
244+
245+
// only get the first element
237246
for (Map.Entry<?, ?> entry : result.entrySet()) {
238-
String keyClassName = entry.getKey() == null ? DEFAULT_CLASS_NAME : entry.getKey().getClass().getName();
239247
String valueClassName = entry.getValue() == null ? DEFAULT_CLASS_NAME : getName(entry.getValue());
240-
builder.append(keyClassName).append(COMMA).append(valueClassName);
248+
249+
if (typeParameters.length == 1) {
250+
builder.append(valueClassName);
251+
} else {
252+
String keyClassName = entry.getKey() == null ? DEFAULT_CLASS_NAME : entry.getKey().getClass().getName();
253+
builder.append(keyClassName).append(COMMA).append(valueClassName);
254+
}
241255
break;
242256
}
257+
243258
return builder.toString();
244259
}
245260

arex-instrumentation-api/src/test/java/io/arex/inst/runtime/util/TypeUtilTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,4 +251,37 @@ void testSerializeObjectToString() {
251251
final String arg2Type = TypeUtil.errorSerializeToString(arg2);
252252
assertEquals("java.lang.Double", arg2Type);
253253
}
254+
255+
@Test
256+
void testMapToString() {
257+
// single generic map
258+
final Map<Integer, String> map = new SingleTypeMap<>();
259+
260+
// empty map
261+
final String name1 = TypeUtil.getName(map);
262+
assertEquals("io.arex.inst.runtime.util.TypeUtilTest$SingleTypeMap", name1);
263+
264+
map.put(1, "test");
265+
final String name = TypeUtil.getName(map);
266+
assertEquals("io.arex.inst.runtime.util.TypeUtilTest$SingleTypeMap-java.lang.String", name);
267+
final Type type = TypeUtil.forName(name);
268+
assert type != null;
269+
assertEquals("io.arex.inst.runtime.util.TypeUtilTest$SingleTypeMap<java.lang.String>", type.getTypeName());
270+
271+
// no generic map
272+
final Map<Integer, String> map2 = new Integer2String();
273+
map2.put(1, "test");
274+
final String name2 = TypeUtil.getName(map2);
275+
assertEquals(Integer2String.class.getName(), name2);
276+
final Type type2 = TypeUtil.forName(name2);
277+
assert type2 != null;
278+
assertEquals(Integer2String.class.getName(), type2.getTypeName());
279+
}
280+
281+
282+
static class SingleTypeMap<V> extends HashMap<Integer, V> {
283+
}
284+
285+
static class Integer2String extends HashMap<Integer, String> {
286+
}
254287
}

0 commit comments

Comments
 (0)