Skip to content

Commit 0b9aeeb

Browse files
committed
泛型泛化
1 parent 4815b6b commit 0b9aeeb

8 files changed

Lines changed: 84 additions & 11 deletions

File tree

‎okhttps-fastjson/src/main/java/com/ejlchina/okhttps/FastjsonMsgConvertor.java‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import java.io.IOException;
88
import java.io.InputStream;
9+
import java.lang.reflect.Type;
910
import java.nio.charset.Charset;
1011
import java.util.List;
1112

@@ -40,7 +41,7 @@ public byte[] serialize(Object object, String dateFormat, Charset charset) {
4041
}
4142

4243
@Override
43-
public <T> T toBean(Class<T> type, InputStream in, Charset charset) {
44+
public <T> T toBean(Type type, InputStream in, Charset charset) {
4445
return JSON.parseObject(toString(in, charset), type);
4546
}
4647

‎okhttps-gson/src/main/java/com/ejlchina/okhttps/GsonMsgConvertor.java‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.io.InputStream;
44
import java.io.InputStreamReader;
5+
import java.lang.reflect.Type;
56
import java.nio.charset.Charset;
67
import java.util.ArrayList;
78
import java.util.Collections;
@@ -54,7 +55,7 @@ public byte[] serialize(Object object, String dateFormat, Charset charset) {
5455
}
5556

5657
@Override
57-
public <T> T toBean(Class<T> type, InputStream in, Charset charset) {
58+
public <T> T toBean(Type type, InputStream in, Charset charset) {
5859
return gson.fromJson(new InputStreamReader(in), type);
5960
}
6061

‎okhttps-jackson/src/main/java/com/ejlchina/okhttps/JacksonMsgConvertor.java‎

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@
22

33
import java.io.IOException;
44
import java.io.InputStream;
5+
import java.lang.reflect.Type;
56
import java.nio.charset.Charset;
67
import java.text.SimpleDateFormat;
78
import java.util.ArrayList;
9+
import java.util.HashMap;
810
import java.util.List;
11+
import java.util.Map;
912

1013
import com.ejlchina.okhttps.internal.HttpException;
1114
import com.fasterxml.jackson.core.JsonProcessingException;
15+
import com.fasterxml.jackson.core.type.TypeReference;
1216
import com.fasterxml.jackson.databind.JsonNode;
1317
import com.fasterxml.jackson.databind.ObjectMapper;
1418
import com.fasterxml.jackson.databind.SerializationFeature;
@@ -20,6 +24,9 @@ public class JacksonMsgConvertor implements MsgConvertor, ConvertProvider {
2024

2125
private ObjectMapper objectMapper;
2226

27+
private final Map<Type, TypeReference<?>> cache = new HashMap<>();
28+
29+
2330
public JacksonMsgConvertor() {
2431
this(new ObjectMapper());
2532
}
@@ -84,10 +91,28 @@ public byte[] serialize(Object object, String dateFormat, Charset charset) {
8491
}
8592
}
8693

94+
private <T> TypeReference<T> toTypeRef(Type type) {
95+
TypeReference<T> typeRef;
96+
synchronized (cache) {
97+
//noinspection unchecked
98+
typeRef = (TypeReference<T>) cache.get(type);
99+
if (typeRef == null) {
100+
typeRef = new TypeReference<T>() {
101+
@Override
102+
public Type getType() {
103+
return type;
104+
}
105+
};
106+
cache.put(type, typeRef);
107+
}
108+
}
109+
return typeRef;
110+
}
111+
87112
@Override
88-
public <T> T toBean(Class<T> type, InputStream in, Charset charset) {
113+
public <T> T toBean(Type type, InputStream in, Charset charset) {
89114
try {
90-
return objectMapper.readValue(in, type);
115+
return objectMapper.readValue(in, toTypeRef(type));
91116
} catch (IOException e) {
92117
throw new HttpException("Jackson 解析异常", e);
93118
}

‎okhttps/src/main/java/com/ejlchina/okhttps/HttpResult.java‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,6 @@ interface Body extends Toable {
193193
Body close();
194194

195195
}
196-
197196

198197
/**
199198
* @return 执行状态

‎okhttps/src/main/java/com/ejlchina/okhttps/MsgConvertor.java‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.io.ByteArrayInputStream;
44
import java.io.InputStream;
5+
import java.lang.reflect.Type;
56
import java.nio.charset.Charset;
67
import java.util.List;
78

@@ -57,7 +58,7 @@ public interface MsgConvertor {
5758
* @param charset 编码格式
5859
* @return Java Bean
5960
*/
60-
<T> T toBean(Class<T> type, InputStream in, Charset charset);
61+
<T> T toBean(Type type, InputStream in, Charset charset);
6162

6263
/**
6364
* 解析为 Java List
@@ -115,7 +116,7 @@ public byte[] serialize(Object object, String dateFormat, Charset charset) {
115116
}
116117

117118
@Override
118-
public <T> T toBean(Class<T> type, InputStream in, Charset charset) {
119+
public <T> T toBean(Type type, InputStream in, Charset charset) {
119120
return convertor.toBean(type, in, charset);
120121
}
121122

‎okhttps/src/main/java/com/ejlchina/okhttps/Toable.java‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import java.io.InputStream;
66
import java.io.Reader;
7+
import java.lang.reflect.Type;
78
import java.util.List;
89

910
public interface Toable {
@@ -50,6 +51,20 @@ public interface Toable {
5051
*/
5152
<T> T toBean(Class<T> type);
5253

54+
/**
55+
* @param <T> 目标泛型
56+
* @param type 目标类型
57+
* @return 报文体Json文本转JavaBean
58+
*/
59+
<T> T toBean(Type type);
60+
61+
/**
62+
* @param <T> 目标泛型
63+
* @param type 目标类型
64+
* @return 报文体Json文本转JavaBean
65+
*/
66+
<T> T toBean(TypeRef<T> type);
67+
5368
/**
5469
* @param <T> 目标泛型
5570
* @param type 目标类型
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.ejlchina.okhttps;
2+
3+
import java.lang.reflect.ParameterizedType;
4+
import java.lang.reflect.Type;
5+
6+
public class TypeRef<T> {
7+
8+
final Type type;
9+
10+
public TypeRef() {
11+
Type superClass = getClass().getGenericSuperclass();
12+
this.type = ((ParameterizedType) superClass).getActualTypeArguments()[0];
13+
}
14+
15+
public Type getType() {
16+
return type;
17+
}
18+
19+
}

‎okhttps/src/main/java/com/ejlchina/okhttps/internal/AbstractBody.java‎

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
package com.ejlchina.okhttps.internal;
22

3+
import java.lang.reflect.Type;
34
import java.nio.charset.Charset;
45
import java.util.List;
56

6-
import com.ejlchina.okhttps.Array;
7-
import com.ejlchina.okhttps.Mapper;
8-
import com.ejlchina.okhttps.MsgConvertor;
9-
import com.ejlchina.okhttps.Toable;
7+
import com.ejlchina.okhttps.*;
108

119
public abstract class AbstractBody implements Toable {
1210

@@ -36,6 +34,20 @@ public Array toArray() {
3634

3735
@Override
3836
public <T> T toBean(Class<T> type) {
37+
return doToBean(type);
38+
}
39+
40+
@Override
41+
public <T> T toBean(Type type) {
42+
return doToBean(type);
43+
}
44+
45+
@Override
46+
public <T> T toBean(TypeRef<T> type) {
47+
return doToBean(type.getType());
48+
}
49+
50+
public <T> T doToBean(Type type) {
3951
if (taskExecutor == null) {
4052
throw new IllegalStateException("没有 taskExecutor,不可做 Bean 转换!");
4153
}

0 commit comments

Comments
 (0)