java在執行時獲取泛型例項的方法

2021-08-10 11:49:05 字數 1959 閱讀 6166

如題,有時候我們在介面中或者是抽象類使用泛型來適應子類不同的型別,可是當我們需要拿到泛型例項或者泛型型別的時候,可以這樣去得到:

抽象類和介面各不相同。

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...