bug fixed for TypeReference oom

This commit is contained in:
高铁
2020-10-11 01:54:17 +08:00
parent 250f6323f3
commit 8e5dad7553
2 changed files with 65 additions and 2 deletions
@@ -14,6 +14,7 @@ import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.Map;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.annotation.JSONField;
public class FieldInfo implements Comparable<FieldInfo> {
@@ -352,8 +353,9 @@ public class FieldInfo implements Comparable<FieldInfo> {
}
if (changed) {
fieldType = new ParameterizedTypeImpl(arguments, parameterizedFieldType.getOwnerType(),
parameterizedFieldType.getRawType());
ParameterizedTypeImpl fieldTypeRaw = new ParameterizedTypeImpl(arguments, parameterizedFieldType.getOwnerType(),
parameterizedFieldType.getRawType());
fieldType = TypeReference.intern(fieldTypeRaw);
return fieldType;
}
}
@@ -0,0 +1,61 @@
package com.alibaba.json.bvt.typeRef;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.parser.ParserConfig;
import java.util.List;
import junit.framework.TestCase;
import java.io.Serializable;
/**
* Created by wenshao on 09/02/2017.
*/
public class TypeReferenceTest14 extends TestCase {
public void test_0() throws Exception {
String str = "{\"result\":{\"item\":[{\"key\":\"123\"}]}}";
ParserConfig config = new ParserConfig();
JSONObject.parseObject(str, OpenSearchResponse.class, config);
JSONObject.parseObject(str
, new TypeReference<OpenSearchResponse<JSONObject>>() {}.getType()
, config, JSON.DEFAULT_PARSER_FEATURE);
int size = config.getDeserializers().size();
for (int i = 0; i < 100 * 1; ++i) {
JSONObject.parseObject(str
, new TypeReference<OpenSearchResponse<JSONObject>>() {}.getType()
, config, JSON.DEFAULT_PARSER_FEATURE);
assertEquals(size, config.getDeserializers().size());
}
}
public static class OpenSearchResponse<T> {
private OpenSearchResult<T> result;
public OpenSearchResult<T> getResult() {
return result;
}
public void setResult(OpenSearchResult<T> result) {
this.result = result;
}
}
public static class OpenSearchResult<T> {
private List<T> item;
public List<T> getItem() {
return item;
}
public void setItem(List<T> item) {
this.item = item;
}
}
}