Maison > Java > javaDidacticiel > le corps du texte

Comment utiliser TypeReference en Java

WBOY
Libérer: 2023-04-24 23:07:05
avant
1872 Les gens l'ont consulté

Lors de l'utilisation de fastJson, TypeReference est utilisé dans de nombreux scénarios de désérialisation générique, par exemple :

void testTypeReference() {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(9);
list.add(4);
list.add(8);
JSONObject jsonObj = new JSONObject();
jsonObj.put("a", list);
System.out.println(jsonObj);

List<String> list2 = jsonObj.getObject("a", new TypeReference<List<Integer>>(){});

System.out.println(list2);
}
//输出

1{"a":[1,9,4,8]}
2[1, 9, 4, 8]
Copier après la connexion
{"msg":"","code":"0","data":[{"adjEq":"","details":[],"imr":"","isoEq":"","mgnRatio":"","mmr":"","notionalUsd":"","ordFroz":"","totalEq":"0","uTime":"1658332171773"}]}
//拿code的值
        String result1 = JSON.toJSONString(result);
        System.out.println("result1=="+result1);

        Result result2 = JSON.parseObject(result1, new TypeReference<Result>() {});
        System.out.println(result2.getCode());
//拿data的值   Balance是data中数据的实体类
		Result<List<Balance>> listResult = JSON.parseObject(result1, new TypeReference<Result<List<Balance>>>() {});
        System.out.println("result2=="+listResult.getData());
Copier après la connexion

L'utilisation de TypeReference peut clairement spécifier le type de désérialisation, et la logique d'implémentation spécifique fait référence au constructeur de TypeReference

protected TypeReference(){
Type superClass = getClass().getGenericSuperclass();

Type type = ((ParameterizedType) superClass).getActualTypeArguments()[0];

Type cachedType = classTypeCache.get(type);
if (cachedType == null) {
classTypeCache.putIfAbsent(type, type);
cachedType = classTypeCache.get(type);
}

this.type = cachedType;
}
Copier après la connexion

Explication :

La méthode principale est : getActualTypeArguments, qui peut obtenir le type de réflexion de la classe parent

ParameterizedType est une interface qui enregistre les génériques de type, hérités de Type, avec un total de trois méthodes :

Type[] getActualTypeArguments(); //返回泛型类型数组
Type getRawType(); //返回原始类型Type
Type getOwnerType(); //返回 Type 对象,表示此类型是其成员之一的类型。
Copier après la connexion

Par exemple, les trois méthodes ParameterizedType correspondantes de Map ont les valeurs suivantes :

[class java.lang.String, class java.lang.String]
interface java.util.Map
null
Copier après la connexion

Exemple :

package JsonLearn;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

public class TypeReferencBaseLearn {
public static class IntMap extends HashMap<String, Integer> {}

void test1() {
IntMap intMap = new IntMap();
System.out.println(“getSuperclass:” + intMap.getClass().getSuperclass());
System.out.println(“getGenericSuperclass:” + intMap.getClass().getGenericSuperclass());
Type type = intMap.getClass().getGenericSuperclass();
if (type instanceof ParameterizedType) {
ParameterizedType p = (ParameterizedType)type;
for (Type t : p.getActualTypeArguments()) {
System.out.println(t);
}
}
}

void test2() {
Map<String, Integer> intMap = new HashMap<>();
System.out.println(“\ngetSuperclass:” + intMap.getClass().getSuperclass());
System.out.println(“getGenericSuperclass:” + intMap.getClass().getGenericSuperclass());
Type type = intMap.getClass().getGenericSuperclass();
if (type instanceof ParameterizedType) {
ParameterizedType p = (ParameterizedType)type;
for (Type t : p.getActualTypeArguments()) {
System.out.println(t);
}
}
}
void test3() {
Map<String, Integer> intMap = new HashMap<String, Integer>(){};
System.out.println(“\ngetSuperclass:” + intMap.getClass().getSuperclass());
System.out.println(“getGenericSuperclass:” + intMap.getClass().getGenericSuperclass());
Type type = intMap.getClass().getGenericSuperclass();
if (type instanceof ParameterizedType) {
ParameterizedType p = (ParameterizedType)type;
for (Type t : p.getActualTypeArguments()) {
System.out.println(t);
}
}
}
public static void main(String[] args) {
TypeReferencBaseLearn obj = new TypeReferencBaseLearn();
obj.test1();
obj.test2();
obj.test3();
}
}
Copier après la connexion

Output:

getSuperclass:class java.util.HashMap
getGenericSuperclass:java util.HashMap
class java.lang.String
class java.lang.Integer

getSuperclass:class java.util.AbstractMap
getGenericSuperclass:java.util.AbstractMap< K , V>
K
V

getSuperclass:class java.util.HashMap
getGenericSuperclass:java.util.HashMap
class java.lang.String
class java. lang .Integer

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal