最近使用gson(google出品的一款進行JSON字符串轉換爲對象的工具)進行JSON字符串轉換爲對象時,對以下代碼標記的地方產生了好奇:json
不清楚爲何JSON轉換爲對象的時候,new TypeToken()後面還要跟着一個大括號
一般是經過 new 構造方法().方法名() 來調用某個類中的方法
但截圖中使用了 new 構造方法(){}.方法名() ,構造方法後面多了一個大括號函數
猜想這裏使用了「匿名內部類」,但不明白爲何要這麼作,因而作個實驗,刪除構造方法後面的{}工具
報錯提示:'TypeToken()' has protected access in 'com.google.gson.reflect.TypeToken'
關鍵詞:protectedgoogle
前往TypeToken這個類的源碼處看一看:spa
構造方法TypeToken()被protected修飾,有以下特色:對象
protected
若是構造函數是protected,那麼該類能夠繼承,能夠在被包內其餘類中產生實例,可是 沒法在包外或者子類之外的地方產生實例
劃重點:若是構造函數是protected,沒法在包外或者子類之外的地方產生實例blog
所以在使用構造方法TypeToken()進行實例化時,須要先經過匿名內部類繼承TypeToken這個類,而後才能進行實例化,進而繼續調用getType()方法。繼承
爲何要用protected來修飾構造方法TypeToken()呢?字符串
爲了拿持有泛型。protected修飾的構造方法,對於非同包須要先用一個類來繼承父類才能new,而後經過繼承的那個類來拿持有泛型。alibaba的fastjson裏也有個相似的類,套路類似。get
TypeToken()這個構造方法是protected修飾的,不能直接被非同包給new出來,須要用一個匿名內部類先繼承再new,而後經過繼承的那個類來拿持有泛型。