fix[enhance]: 字节码增强的类型转换必须要泛型擦除,erasureList,erasureSet,erasureMap会在字节码增强的代码中调用

This commit is contained in:
godotg
2022-09-25 16:01:00 +08:00
parent cf777c7fa5
commit 9f00989338
4 changed files with 16 additions and 3 deletions
@@ -98,6 +98,19 @@ public abstract class CollectionUtils {
return size <= 0 ? new HashMap<>() : new HashMap<>(comfortableCapacity(size));
}
// 字节码增强的类型转换必须要泛型擦除,erasureListerasureSeterasureMap会在字节码增强的代码中调用
public static List<Object> erasureList(int size) {
return newList(size);
}
public static Set<Object> erasureSet(int size) {
return newSet(size);
}
public static Map<Object, Object> erasureMap(int size) {
return newMap(size);
}
/**
* 数组初始化长度的安全上限限制,防止反序列化异常导致内存突然升高
@@ -67,7 +67,7 @@ public class EnhanceListSerializer implements IEnhanceSerializer {
var size = "size" + GenerateProtocolFile.index.getAndIncrement();
builder.append(StringUtils.format("int {}={}.readInt($1);", size, EnhanceUtils.byteBufUtils));
builder.append(StringUtils.format("List {} = CollectionUtils.newList({});", list, size));
builder.append(StringUtils.format("List {} = CollectionUtils.erasureList({});", list, size));
var i = "i" + GenerateProtocolFile.index.getAndIncrement();
@@ -80,7 +80,7 @@ public class EnhanceMapSerializer implements IEnhanceSerializer {
var size = "size" + GenerateProtocolFile.index.getAndIncrement();
builder.append(StringUtils.format("int {}={}.readInt($1);", size, EnhanceUtils.byteBufUtils));
builder.append(StringUtils.format("Map {} = CollectionUtils.newMap({});", map, size));
builder.append(StringUtils.format("Map {} = CollectionUtils.erasureMap({});", map, size));
var i = "i" + GenerateProtocolFile.index.getAndIncrement();
builder.append(StringUtils.format("for(int {}=0; {}<{}; {}++){", i, i, size, i));
@@ -65,7 +65,7 @@ public class EnhanceSetSerializer implements IEnhanceSerializer {
var size = "size" + GenerateProtocolFile.index.getAndIncrement();
builder.append(StringUtils.format("int {} = {}.readInt($1);", size, EnhanceUtils.byteBufUtils));
builder.append(StringUtils.format("Set {} = CollectionUtils.newSet({});", set, size));
builder.append(StringUtils.format("Set {} = CollectionUtils.erasureSet({});", set, size));
var i = "i" + GenerateProtocolFile.index.getAndIncrement();
builder.append(StringUtils.format("for(int {}=0; {}<{}; {}++){", i, i, size, i));