gson中对构造方法TypeToken()的探究

问题提出

最近使用gson(google出品的一款进行JSON字符串转换为对象的工具)进行JSON字符串转换为对象时,对如下代码标记的地方产生了好奇:
01 TypeToken(){}匿名内部类

不清楚为什么JSON转换为对象的时候,new TypeToken()后面还要跟着一个大括号
通常是通过 new 构造方法().方法名() 来调用某个类中的方法
但截图中使用了 new 构造方法(){}.方法名() ,构造方法后面多了一个大括号

问题探索

猜测这里使用了“匿名内部类”,但不明白为什么要这么做,于是做个实验,删除构造方法后面的{}
02 删除删除构造方法后面的{}

报错提示:‘TypeToken()’ has protected access in ‘com.google.gson.reflect.TypeToken’
关键词:protected

前往TypeToken这个类的源码处看一看:
03 class TypeToken的源码

构造方法TypeToken()被protected修饰,有如下特点:

protected
如果构造函数是protected,那么该类可以继承,可以在被包内其他类中产生实例,但是无法在包外或者子类以外的地方产生实例

划重点:如果构造函数是protected,无法在包外或者子类以外的地方产生实例

因此在使用构造方法TypeToken()进行实例化时,需要先通过匿名内部类继承TypeToken这个类,然后才能进行实例化,进而继续调用getType()方法。

为什么要用protected来修饰构造方法TypeToken()呢?

为了拿持有泛型。protected修饰的构造方法,对于非同包需要先用一个类来继承父类才能new,然后通过继承的那个类来拿持有泛型。alibaba的fastjson里也有个类似的类,套路相似。

总结

TypeToken()这个构造方法是protected修饰的,不能直接被非同包给new出来,需要用一个匿名内部类先继承再new,然后通过继承的那个类来拿持有泛型。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JellyfishMIX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值