如題,有時候我們在介面中或者是抽象類使用泛型來適應子類不同的型別,可是當我們需要拿到泛型例項或者泛型型別的時候,可以這樣去得到:
抽象類和介面各不相同。
class
<?> aclass = obj.getclass();//先得到類的位元組碼
type genericsuperclass = aclass.getgenericsuperclass();// 返回超類的type
parameterizedtype types = (parameterizedtype) genericsuperclass;// 如果超類是引數化型別,返回的type物件必須準確地反映源**中使用的實際型別引數,也就是 parameterizedtype 型別
type actualtypearguments = types.getactualtypearguments();//返回表示此型別的實際型別引數的type物件的陣列。請注意,在某些情況下,返回的陣列是空的。如果此型別表示巢狀在引數化型別中的非引數化型別,則會發生這種情況。
class
reponseclass = (class) actualtypearguments[0];
class<?> aclass = obj.getclass();//先得到類的位元組碼
/*返回表示由此物件表示的類或介面直接實現的介面的型別。
如果超級介面是乙個引數化型別,返回的type物件必須準確地反映源**中使用的實際型別引數。代表每個超級介面的引數化型別是在之前沒有建立的情況下建立的。有關引數化型別的建立過程的語義,請參閱parameterizedtype的宣告。
如果此物件表示乙個類,則返回值是乙個包含表示由類實現的所有介面的物件的陣列。陣列中介面物件的順序對應於該物件表示的類的宣告的implements子句中的介面名稱的順序。在陣列類中,介面cloneable和serializable按照這個順序返回。
如果此物件表示乙個介面,則該陣列包含表示由該介面直接擴充套件的所有介面的物件。陣列中介面物件的順序對應於該物件表示的介面宣告的extends子句中介面名稱的順序。
如果此物件表示不實現介面的類或介面,則該方法返回長度為0的陣列。
如果這個物件表示乙個原始型別或void,則該方法返回乙個長度為0的陣列。
* */
type types = aclass.getgenericinte***ces();
parameterizedtype
parameterizedtype = (parameterizedtype) types[0];
type actualtypearguments = parameterizedtype.getactualtypearguments();
class
reponseclass = (class) actualtypearguments[0];
最後附上完整工具類**:
/**
* 執行時獲取泛型型別
*/public
class
genericutil else
} catch (instantiationexception e) catch (illegalacces***ception e)
return
null;
}public
static
t getinte***cetype(object obj, int i) catch (instantiationexception e) catch (illegalacces***ception e)
return
null;
}public
static class<?> forname(string classname) catch (classnotfoundexception e)
return
null;
}}
得到執行時類的泛型型別。
得到反射型別 private class getgenerictype return clazz 類結構 public abstract class basicdaoimplextends hibernatedaosupport implements basicdao 繼承類 resource na...
java獲取程式執行時間
第一種是以毫秒為單位計算的。偽 long starttime system.currenttimemillis 獲取開始時間 dosomething 測試的 段 long endtime system.currenttimemillis 獲取結束時間 偽 long starttime system....
集合與泛型的執行時間測試
string time1 string time2 集合 stopwatch sw1 new stopwatch sw1.start arraylist mylist1 new arraylist for int i 0 i 10000000 i mylist1.add i int sum1 0 f...