Skip to content

Commit db90cf3

Browse files
committed
add support for AtomicXXX
1 parent f7c9947 commit db90cf3

15 files changed

+533
-98
lines changed

src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -563,7 +563,7 @@ public void parseArray(Type type, Collection array, Object fieldName) {
563563
}
564564

565565
if (int.class == type) {
566-
Object val = IntegerDeserializer.deserialze(this);
566+
Object val = IntegerDeserializer.instance.deserialze(this, null, null);
567567
array.add(val);
568568
} else if (String.class == type) {
569569
String value;

src/main/java/com/alibaba/fastjson/parser/ParserConfig.java

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import java.io.Closeable;
1919
import java.io.File;
2020
import java.io.Serializable;
21+
import java.lang.ref.SoftReference;
22+
import java.lang.ref.WeakReference;
2123
import java.lang.reflect.Constructor;
2224
import java.lang.reflect.Field;
2325
import java.lang.reflect.Modifier;
@@ -51,8 +53,12 @@
5153
import java.util.UUID;
5254
import java.util.concurrent.ConcurrentHashMap;
5355
import java.util.concurrent.ConcurrentMap;
56+
import java.util.concurrent.atomic.AtomicBoolean;
57+
import java.util.concurrent.atomic.AtomicInteger;
5458
import java.util.concurrent.atomic.AtomicIntegerArray;
59+
import java.util.concurrent.atomic.AtomicLong;
5560
import java.util.concurrent.atomic.AtomicLongArray;
61+
import java.util.concurrent.atomic.AtomicReference;
5662
import java.util.regex.Pattern;
5763

5864
import com.alibaba.fastjson.JSONArray;
@@ -104,6 +110,7 @@
104110
import com.alibaba.fastjson.parser.deserializer.PatternDeserializer;
105111
import com.alibaba.fastjson.parser.deserializer.PointDeserializer;
106112
import com.alibaba.fastjson.parser.deserializer.RectangleDeserializer;
113+
import com.alibaba.fastjson.parser.deserializer.ReferenceDeserializer;
107114
import com.alibaba.fastjson.parser.deserializer.SqlDateDeserializer;
108115
import com.alibaba.fastjson.parser.deserializer.StackTraceElementDeserializer;
109116
import com.alibaba.fastjson.parser.deserializer.StringDeserializer;
@@ -224,6 +231,14 @@ public ParserConfig(){
224231
derializers.put(Class.class, ClassDerializer.instance);
225232
derializers.put(char[].class, CharArrayDeserializer.instance);
226233

234+
derializers.put(AtomicBoolean.class, BooleanDeserializer.instance);
235+
derializers.put(AtomicInteger.class, IntegerDeserializer.instance);
236+
derializers.put(AtomicLong.class, LongDeserializer.instance);
237+
derializers.put(AtomicReference.class, ReferenceDeserializer.instance);
238+
239+
derializers.put(WeakReference.class, ReferenceDeserializer.instance);
240+
derializers.put(SoftReference.class, ReferenceDeserializer.instance);
241+
227242
derializers.put(UUID.class, UUIDDeserializer.instance);
228243
derializers.put(TimeZone.class, TimeZoneDeserializer.instance);
229244
derializers.put(Locale.class, LocaleDeserializer.instance);
@@ -308,7 +323,7 @@ public ObjectDeserializer getDeserializer(Class<?> clazz, Type type) {
308323
if (derializer != null) {
309324
return derializer;
310325
}
311-
326+
312327
{
313328
JSONType annotation = clazz.getAnnotation(JSONType.class);
314329
if (annotation != null) {
@@ -392,12 +407,12 @@ public ObjectDeserializer createJavaBeanDeserializer(Class<?> clazz, Type type)
392407
if (beanInfo.getFieldList().size() > 200) {
393408
asmEnable = false;
394409
}
395-
410+
396411
Constructor<?> defaultConstructor = beanInfo.getDefaultConstructor();
397412
if (defaultConstructor == null && !clazz.isInterface()) {
398413
asmEnable = false;
399414
}
400-
415+
401416
for (FieldInfo fieldInfo : beanInfo.getFieldList()) {
402417
if (fieldInfo.isGetOnly()) {
403418
asmEnable = false;
@@ -428,9 +443,9 @@ public ObjectDeserializer createJavaBeanDeserializer(Class<?> clazz, Type type)
428443

429444
try {
430445
return ASMDeserializerFactory.getInstance().createJavaBeanDeserializer(this, clazz, type);
431-
// } catch (VerifyError e) {
432-
// e.printStackTrace();
433-
// return new JavaBeanDeserializer(this, clazz, type);
446+
// } catch (VerifyError e) {
447+
// e.printStackTrace();
448+
// return new JavaBeanDeserializer(this, clazz, type);
434449
} catch (NoSuchMethodException error) {
435450
return new JavaBeanDeserializer(this, clazz, type);
436451
} catch (ASMException asmError) {

src/main/java/com/alibaba/fastjson/parser/deserializer/BooleanDeserializer.java

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,52 @@
11
package com.alibaba.fastjson.parser.deserializer;
22

33
import java.lang.reflect.Type;
4+
import java.util.concurrent.atomic.AtomicBoolean;
45

56
import com.alibaba.fastjson.parser.DefaultJSONParser;
67
import com.alibaba.fastjson.parser.JSONLexer;
78
import com.alibaba.fastjson.parser.JSONToken;
89
import com.alibaba.fastjson.util.TypeUtils;
910

1011
public class BooleanDeserializer implements ObjectDeserializer {
12+
1113
public final static BooleanDeserializer instance = new BooleanDeserializer();
12-
13-
@SuppressWarnings("unchecked")
14-
public <T> T deserialze(DefaultJSONParser parser, Type clazz, Object fieldName) {
15-
return (T) deserialze(parser);
16-
}
1714

1815
@SuppressWarnings("unchecked")
19-
public static <T> T deserialze(DefaultJSONParser parser) {
16+
public <T> T deserialze(DefaultJSONParser parser, Type clazz, Object fieldName) {
2017
final JSONLexer lexer = parser.getLexer();
21-
18+
19+
Boolean boolObj;
2220
if (lexer.token() == JSONToken.TRUE) {
2321
lexer.nextToken(JSONToken.COMMA);
24-
return (T) Boolean.TRUE;
25-
}
26-
27-
if (lexer.token() == JSONToken.FALSE) {
22+
boolObj = Boolean.TRUE;
23+
} else if (lexer.token() == JSONToken.FALSE) {
2824
lexer.nextToken(JSONToken.COMMA);
29-
return (T) Boolean.FALSE;
30-
}
31-
32-
if (lexer.token() == JSONToken.LITERAL_INT) {
25+
boolObj = Boolean.FALSE;
26+
} else if (lexer.token() == JSONToken.LITERAL_INT) {
3327
int intValue = lexer.intValue();
3428
lexer.nextToken(JSONToken.COMMA);
35-
29+
3630
if (intValue == 1) {
37-
return (T) Boolean.TRUE;
31+
boolObj = Boolean.TRUE;
3832
} else {
39-
return (T) Boolean.FALSE;
33+
boolObj = Boolean.FALSE;
34+
}
35+
} else {
36+
Object value = parser.parse();
37+
38+
if (value == null) {
39+
return null;
4040
}
41+
42+
boolObj = TypeUtils.castToBoolean(value);
4143
}
42-
43-
Object value = parser.parse();
4444

45-
if (value == null) {
46-
return null;
45+
if (clazz == AtomicBoolean.class) {
46+
return (T) new AtomicBoolean(boolObj.booleanValue());
4747
}
48-
49-
return (T) TypeUtils.castToBoolean(value);
48+
49+
return (T) boolObj;
5050
}
5151

5252
public int getFastMatchToken() {

src/main/java/com/alibaba/fastjson/parser/deserializer/DefaultObjectDeserializer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -320,13 +320,13 @@ public void parseObject(DefaultJSONParser parser, Object object) {
320320
Type fieldType = method.getGenericParameterTypes()[0];
321321
if (fieldClass == int.class) {
322322
lexer.nextTokenWithColon(JSONToken.LITERAL_INT);
323-
args[0] = IntegerDeserializer.deserialze(parser);
323+
args[0] = IntegerDeserializer.instance.deserialze(parser, fieldType, null);
324324
} else if (fieldClass == String.class) {
325325
lexer.nextTokenWithColon(JSONToken.LITERAL_STRING);
326326
args[0] = StringDeserializer.deserialze(parser);
327327
} else if (fieldClass == long.class) {
328328
lexer.nextTokenWithColon(JSONToken.LITERAL_INT);
329-
args[0] = LongDeserializer.deserialze(parser);
329+
args[0] = LongDeserializer.instance.deserialze(parser, fieldType, null);
330330
} else if (fieldClass == List.class) {
331331
lexer.nextTokenWithColon(JSONToken.LBRACE);
332332
args[0] = CollectionDeserializer.instance.deserialze(parser, fieldType, null);

src/main/java/com/alibaba/fastjson/parser/deserializer/IntegerDeserializer.java

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,44 +2,46 @@
22

33
import java.lang.reflect.Type;
44
import java.math.BigDecimal;
5+
import java.util.concurrent.atomic.AtomicInteger;
56

67
import com.alibaba.fastjson.parser.DefaultJSONParser;
78
import com.alibaba.fastjson.parser.JSONLexer;
89
import com.alibaba.fastjson.parser.JSONToken;
910
import com.alibaba.fastjson.util.TypeUtils;
1011

1112
public class IntegerDeserializer implements ObjectDeserializer {
13+
1214
public final static IntegerDeserializer instance = new IntegerDeserializer();
1315

1416
@SuppressWarnings("unchecked")
1517
public <T> T deserialze(DefaultJSONParser parser, Type clazz, Object fieldName) {
16-
return (T) deserialze(parser);
17-
}
18-
19-
@SuppressWarnings("unchecked")
20-
public static <T> T deserialze(DefaultJSONParser parser) {
2118
final JSONLexer lexer = parser.getLexer();
22-
19+
2320
if (lexer.token() == JSONToken.NULL) {
2421
lexer.nextToken(JSONToken.COMMA);
2522
return null;
2623
}
27-
24+
25+
Integer intObj;
2826
if (lexer.token() == JSONToken.LITERAL_INT) {
2927
int val = lexer.intValue();
3028
lexer.nextToken(JSONToken.COMMA);
31-
return (T) Integer.valueOf(val);
32-
}
33-
34-
if (lexer.token() == JSONToken.LITERAL_FLOAT) {
29+
intObj = Integer.valueOf(val);
30+
} else if (lexer.token() == JSONToken.LITERAL_FLOAT) {
3531
BigDecimal decimalValue = lexer.decimalValue();
3632
lexer.nextToken(JSONToken.COMMA);
37-
return (T) Integer.valueOf(decimalValue.intValue());
33+
intObj = Integer.valueOf(decimalValue.intValue());
34+
} else {
35+
Object value = parser.parse();
36+
37+
intObj = TypeUtils.castToInt(value);
3838
}
3939

40-
Object value = parser.parse();
41-
42-
return (T) TypeUtils.castToInt(value);
40+
if (clazz == AtomicInteger.class) {
41+
return (T) new AtomicInteger(intObj.intValue());
42+
}
43+
44+
return (T) intObj;
4345
}
4446

4547
public int getFastMatchToken() {

src/main/java/com/alibaba/fastjson/parser/deserializer/LongDeserializer.java

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.alibaba.fastjson.parser.deserializer;
22

33
import java.lang.reflect.Type;
4+
import java.util.concurrent.atomic.AtomicLong;
45

56
import com.alibaba.fastjson.parser.DefaultJSONParser;
67
import com.alibaba.fastjson.parser.JSONLexer;
@@ -13,25 +14,29 @@ public class LongDeserializer implements ObjectDeserializer {
1314

1415
@SuppressWarnings("unchecked")
1516
public <T> T deserialze(DefaultJSONParser parser, Type clazz, Object fieldName) {
16-
return (T) deserialze(parser);
17-
}
18-
19-
@SuppressWarnings("unchecked")
20-
public static <T> T deserialze(DefaultJSONParser parser) {
2117
final JSONLexer lexer = parser.getLexer();
18+
19+
Long longObject;
2220
if (lexer.token() == JSONToken.LITERAL_INT) {
2321
long longValue = lexer.longValue();
2422
lexer.nextToken(JSONToken.COMMA);
25-
return (T) Long.valueOf(longValue);
26-
}
23+
longObject = Long.valueOf(longValue);
24+
} else {
2725

28-
Object value = parser.parse();
26+
Object value = parser.parse();
2927

30-
if (value == null) {
31-
return null;
32-
}
28+
if (value == null) {
29+
return null;
30+
}
3331

34-
return (T) TypeUtils.castToLong(value);
32+
longObject = TypeUtils.castToLong(value);
33+
}
34+
35+
if (clazz == AtomicLong.class) {
36+
return (T) new AtomicLong(longObject.longValue());
37+
}
38+
39+
return (T) longObject;
3540
}
3641

3742
public int getFastMatchToken() {
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.alibaba.fastjson.parser.deserializer;
2+
3+
import java.lang.ref.SoftReference;
4+
import java.lang.ref.WeakReference;
5+
import java.lang.reflect.ParameterizedType;
6+
import java.lang.reflect.Type;
7+
import java.util.concurrent.atomic.AtomicReference;
8+
9+
import com.alibaba.fastjson.parser.DefaultJSONParser;
10+
import com.alibaba.fastjson.parser.JSONToken;
11+
12+
public class ReferenceDeserializer implements ObjectDeserializer {
13+
14+
public final static ReferenceDeserializer instance = new ReferenceDeserializer();
15+
16+
@SuppressWarnings({ "unchecked", "rawtypes" })
17+
public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
18+
ParameterizedType paramType = (ParameterizedType) type;
19+
Type itemType = paramType.getActualTypeArguments()[0];
20+
21+
Object itemObject = parser.parseObject(itemType);
22+
23+
Type rawType = paramType.getRawType();
24+
if (rawType == AtomicReference.class) {
25+
return (T) new AtomicReference(itemObject);
26+
}
27+
28+
if (rawType == WeakReference.class) {
29+
return (T) new WeakReference(itemObject);
30+
}
31+
32+
if (rawType == SoftReference.class) {
33+
return (T) new SoftReference(itemObject);
34+
}
35+
36+
throw new UnsupportedOperationException(rawType.toString());
37+
}
38+
39+
public int getFastMatchToken() {
40+
return JSONToken.LBRACE;
41+
}
42+
}

0 commit comments

Comments
 (0)