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

问题提出

最近使用gson(google出品的一款进行JSON字符串转换为对象的工具)进行JSON字符串转换为对象时,对以下代码标记的地方产生了好奇:json

01 TypeToken(){}匿名内部类.png

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

问题探索

猜想这里使用了“匿名内部类”,但不明白为何要这么作,因而作个实验,删除构造方法后面的{}工具

02 删除删除构造方法后面的{}.png

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

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

03 class TypeToken的源码.png

构造方法TypeToken()被protected修饰,有以下特色:对象

protected
若是构造函数是protected,那么该类能够继承,能够在被包内其余类中产生实例,可是 没法在包外或者子类之外的地方产生实例

划重点:若是构造函数是protected,没法在包外或者子类之外的地方产生实例blog

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

为何要用protected来修饰构造方法TypeToken()呢?字符串

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

总结

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

相关文章
相关标签/搜索