java反射之超型別限定?super
阿新 • • 發佈:2018-11-28
package com.test.testClass; import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) throws IllegalAccessException, InstantiationException { Class<TonyToy> cls = TonyToy.class; TonyToy tonyToy = cls.newInstance(); Class<? super TonyToy> cls1 = cls.getSuperclass(); Object object = cls1.newInstance(); } } class TonyToy { }
1 TonyToy.class -> 生成Class物件,同時泛化為TonyToy類。
(.class 生成Class物件,然後使用該物件。這分為三步:載入,連結,初始化。載入:由類的載入器執行,查詢相關位元組碼,然後生成Class物件。連結:驗證位元組碼,為靜態域分配儲存空間。初始化:如果該類由超類,進行初始化,執行靜態初始化塊和靜態初始化器。)(final static修飾的屬性,可以不用初始化,直接讀取其值。)
2.下一句:cls.newInstance() 則建立了一個TonyToy的例項。
cls需要一個空構造器來建立這個例項,若沒有則會報異常。
3.我們想過cls,也就是TonyToy來建立它的父類物件。我們可以看到<>裡是? super TonyToy
我們先不考慮這個。假設有一個TonyToy有一個Toy父類。那麼,在<>裡,我該寫Toy嗎?答案是不能這麼寫。
因為Class的不確定性, 導致我們明面上不能直接寫Toy,而是應該寫 ? super TonyToy ,這樣,即使程式中沒有TonyToy的父類存在,也會建立一個TonyToy的父類,然後建立一個例項。反射不管你程式中有沒有指定父類。它都會通過? super TonyToy,這種形式,來代表TonyToy的父類。父類的不確定性,導致假設它的直接父類是Object,所以newInstance()返回的是Object型別。