TypeToken分析(json字符串- list对象)

简介: TypeToken分析(json字符串- list对象)

注意本篇数据交换- JSON(教你学会什么是JSON)

配套起来观看更好

json字符串 -> list对象

(1) 如果需要把json字符串 转成 集合这样复杂的类型, 需要使用gson提供的一个类

(2) TypeToken , 是一个自定义泛型类, 然后通过TypeToken来指定我们需要转换成的类型

com.google.gson.reflect
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class TypeToken<T> {
    final Class<? super T> rawType;
    final Type type;
    final int hashCode;
    protected TypeToken() {
        this.type = getSuperclassTypeParameter(this.getClass());
        this.rawType = Types.getRawType(this.type);
        this.hashCode = this.type.hashCode();
    }

分析一

(1) 返回类型的完整路径java.util.List<com.wyxdu.json.Book>

(2) gson的设计者,需要得到类型的完整路径,然后进行底层反射

(3) 所以gson 设计者就提供TypeToken, 来搞定.

分析二

(1) 如果我们 new TypeToken<List>() 提示’TypeToken()’ has protected access in ‘com.google.gson.reflect.TypeToken’

(2) 因为TypeToken 的无参构造器是protected , 而 new TypeToken<List>() 就是调用其无参构造器

(3) 根据java基础, 如果一个方法是protected ,而且不在同一个包, 是不能直接访问的, 因此报错

(4) 为什么 new TypeToken<List>(){} 使用就可以,这里就涉及到匿名内部类的知识.

(5) 当 new TypeToken<List>(){} 其实这个类型就是不是 TypeToken 而是一个匿名内部类(子类)

(6) 而且这个匿名内部类是有自己的无参构造器(隐式), 根据java基础规则 当执行子类的无参构造器时, 默认super();

模拟实现

首先

建立一个包然后创建一个类 我这里就是Text/T1.java

package t1;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class A<T> {
    protected A() {
        System.out.println("A的protected A()被调用...");
    }
}

其次

再建立一个包然后创建一个类 我这里就是Text2/T2.java

package t2;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import t1.A;
public class Test {
    public static void main(String[] args) {
        //'A()' has protected access in 'com.t1.A'
        A a = new A<String>(){};
        System.out.println(a.getClass());//Test$1
    }
}

如果直接调用会报错 ‘A()’ has protected access in ‘t1.A’

  1. 因为A类和Test类不在同一个包
  2. 就不能访问A类的protected 方法,包括构造器
  3. A(){} 就是一个匿名内部类, 可以理解成是A类子类
  4. A(){} 匿名内部类,有一个隐式的无参构造器,根据java基础 无参构造器 有默认super()
  5. 当你执行 new A(){} 会调用到A类的无参的protected 构造器

总结

当我们需要调用其他包下的受保护的方法时我们应该采用匿名内部类的方式去调用 相当于是创建了一个A类的子类


目录
相关文章
|
2月前
|
Apache 索引
精进Hudi系列|Apache Hudi索引实现分析(五)之基于List的IndexFileFilter
精进Hudi系列|Apache Hudi索引实现分析(五)之基于List的IndexFileFilter
17 0
|
2月前
|
Java
java8中List对象转另一个List对象
java8中List对象转另一个List对象
39 0
|
3月前
|
Web App开发 JSON JavaScript
SAP UI5 应用程序小技巧 - 一键将 JSON 对象导出成本地 json 文件
SAP UI5 应用程序小技巧 - 一键将 JSON 对象导出成本地 json 文件
26 0
|
2月前
|
存储 JSON 安全
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
67 0
|
2月前
|
存储 JSON JavaScript
Python字典和JSON字符串相互转化方法
【2月更文挑战第18天】
62 3
|
2天前
|
存储 JSON DataWorks
DataWorks产品使用合集之DataWorks将 MongoDB 中的数组类型写入到 DataWorks 的单个字段时,表示为字符串格式而非 JSON 格式如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
12 3
|
2天前
|
JSON 分布式计算 大数据
MaxCompute产品使用合集之大数据计算MaxCompute 要提取JSON字符串中的所有key-value对,我该怎么操作
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
6天前
字符串和list互转
字符串和list互转
10 0
|
10天前
|
JSON 运维 Kubernetes
云效产品使用报错问题之流水线中配置了AppStack,构建时下载的制品内容为json字符串,如何解决
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
15天前
|
JSON 数据格式 Python
py如何把字符串转出json
py如何把字符串转出json
6 0