fastjson TypeReference 揭秘

导读:本篇文章讲解 fastjson TypeReference 揭秘,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

原文链接:https://muyig.github.io/blog/2020/01/10/TypeReference/
在这里插入图片描述

String userString = "[{\"userId\":\"111\",\"userName\":\"Tom\"},{\"userId\":\"222\",\"userName\":\"Jerry\"}]";
List<UserInfo> input = new ArrayList<>();
List<UserInfo> userInfoList = JSON.parseObject(userString, input.getClass());

在这里插入图片描述

java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.vdian.dagon.core.user.UserInfo

在这里插入图片描述

List<UserInfo> userInfoList = JSON.parseObject(userString, new TypeReference<List<UserInfo>>() {});

在这里插入图片描述

@SuppressWarnings("unchecked")
public static <T> T parseObject(String text, TypeReference<T> type, Feature... features) {
    return (T) parseObject(text, type.type, ParserConfig.global, DEFAULT_PARSER_FEATURE, features);
}

在这里插入图片描述

new Runnable() {
    @Override
    public void run() {
        // ...
    }
};

在这里插入图片描述

new AbstractList<String>() {
    @Override
    public int size() {
        return 0;
    }

    @Override
    public String get(int index) {
        return null;
    }
};

在这里插入图片描述

new ArrayList<String>() {
    // 因为父类非抽象,因此不需要实现任何方法(当然如果想重写也是可以的)
};

在这里插入图片描述
在这里插入图片描述

public class TypeReference<T> {
    protected final Type type;

    /**
     * Constructs a new type literal. Derives represented class from type
     * parameter.
     *
     * <p>Clients create an empty anonymous subclass. Doing so embeds the type
     * parameter in the anonymous class's type hierarchy so we can reconstitute it
     * at runtime despite erasure.
     */
    protected TypeReference(){
        // 1. 获取当前类的父类的类型定义,由于我们采用了创建匿名子类的方式,所以这里拿到的就是 TypeReference的类型定义。
        Type superClass = getClass().getGenericSuperclass();
        // 2.强转为ParameterizedType,获取到泛型参数数组。
        Type type = ((ParameterizedType) superClass).getActualTypeArguments()[0];
        // 省略缓存逻辑
        this.type = cachedType;
    }
    
    // 其他方法
}

在这里插入图片描述
在这里插入图片描述

public class ReflectionTest {

    static class SubArrayList1<E> extends ArrayList<E> {

    }

    static class SubArrayList2 extends ArrayList<String> {

    }

    private static void printSuperclass(Class<?> c) {
        Type superclass = c.getGenericSuperclass();
        ParameterizedType parameterizedType = (ParameterizedType) superclass;
        System.out.println("superclass:" + parameterizedType.getTypeName());
    }

    public static void main(String[] args) {
        SubArrayList1<String> subArrayList1 = new SubArrayList1<>();
        printSuperclass(subArrayList1.getClass());
        SubArrayList2 subArrayList2 = new SubArrayList2();
        printSuperclass(subArrayList2.getClass());
        printSuperclass(new ArrayList<String>() {}.getClass());
    }

}

在这里插入图片描述

superclass:java.util.ArrayList<E>
superclass:java.util.ArrayList<java.lang.String>
superclass:java.util.ArrayList<java.lang.String>

在这里插入图片描述

ReflectionTest.class :
没找到

ReflectionTest\$1.class :
Signature: #13                          // Ljava/util/ArrayList<Ljava/lang/String;>;

ReflectionTest\$SubArrayList1.class :
Signature: #16                          // <E:Ljava/lang/Object;>Ljava/util/ArrayList<TE;>;

ReflectionTest\$SubArrayList2.class :
Signature: #14                          // Ljava/util/ArrayList<Ljava/lang/String;>;

在这里插入图片描述

public class ReflectionTest {

    class TestInterface implements Callable<String>, Comparable<Integer> {

        @Override
        public String call() {
            return null;
        }

        @Override
        public int compareTo(Integer o) {
            return 0;
        }

    }

    private static void printInterfaces(Class<?> c) {
        Type[] types = c.getGenericInterfaces();
        for (Type type : types) {
            ParameterizedType parameterizedType = (ParameterizedType) type;
            System.out.println(parameterizedType.getTypeName());
        }
    }

    public static void main(String[] args) {
        printInterfaces(TestInterface.class);
    }

}

在这里插入图片描述

java.util.concurrent.Callable<java.lang.String>
java.lang.Comparable<java.lang.Integer>

在这里插入图片描述

ReflectionTest\$TestInterface.class : 
Signature: #32                          // Ljava/lang/Object;Ljava/util/concurrent/Callable<Ljava/lang/String;>;Ljava/lang/Comparable<Ljava/lang/Integer;>;

在这里插入图片描述

public class BaseGeneric<T> {

    private T data;

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public BaseGeneric(T data) {
        this.data = data;
    }

    public BaseGeneric() {

    }

    public static void main(String[] args) {
        new BaseGeneric<String>() {};
    }

}

在这里插入图片描述

BaseGeneric.class
Signature: #31                          // <T:Ljava/lang/Object;>Ljava/lang/Object;

BaseGeneric$1.class
Signature: #13                          // Lcom/sunshinevvv/thinkinginjava/generics/BaseGeneric<Ljava/lang/String;>;

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/73822.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!