1. 程式人生 > >getSuperclass和getGenericSuperclass區別(java泛型和反射綜合應用)

getSuperclass和getGenericSuperclass區別(java泛型和反射綜合應用)

1.官方API對這兩個方法的介紹 .

  • getSuperclass :
    返回表示此 Class 所表示的實體(類、介面、基本型別或 void)的超類的 Class。如果此 Class 表示 Object 類、一個介面、一個基本型別或 void,則返回 null。如果此物件表示一個數組類,則返回表示該 Object 類的 Class 物件。
  • getGenericSuperclass :
    返回表示此 Class 所表示的實體(類、介面、基本型別或 void)的直接超類的Type。如果超類是引數化型別,則返回的 Type 物件必須準確反映原始碼中所使用的實際型別引數。如果以前未曾建立表示超類的引數化型別,則建立這個型別。有關引數化型別建立過程的語義,請參閱 ParameterizedType 宣告。如果此 Class 表示 Object 類、介面、基本型別或 void,則返回 null。如果此物件表示一個數組類,則返回表示 Object 類的 Class 物件。

2.二者異同點

兩個方法都是獲取超類的型別 .
看一個例子 :
這裡寫圖片描述

這裡寫圖片描述
列印結果 :
這裡寫圖片描述

這兩者都能獲取父類的型別 .

但是如果我們換成下面形式, 我們就可以找到兩個方法差別 .
這裡寫圖片描述

這裡寫圖片描述

上面的方法, 我們使用”getGenericSuperclass()”方法獲取父類的型別, 然後重新讀一遍該方法的說明 “如果超類是引數化型別,則返回的 Type 物件必須準確反映原始碼中所使用的實際型別引數 ” . 也就是這種方式可以獲取超類的引數型別, 也就是泛型中的”Integer”型別 .
但是如果上面方法我們使用”getSuperclass() “方法就會出現型別轉換錯誤”java.lang.Class cannot be cast to java.lang.reflect.
ParameterizedType”,

3. 實際應用.

記得以前使用hibernate時候, 我們會為所有Dao建立一個BaseDao, 將一般的增刪改查操作抽取到BaseDao中 .
下面就是一個例子 :
這裡寫圖片描述

這裡寫圖片描述
我們將增刪改查一般操作放在BaseDao中, 但是在”查”過程中, 遇到問題 . 當使用Hibernate拼寫HQL時候, 查一張表需要知道這張表對應的物件的名稱 . 比如”t_user”對應”User” . 那麼在HQL中需要使用”User” . 但是在父類BaseDao中如何獲取子類操作什麼型別物件(UserDao操作User, DepartmentDao操作Department),
上面構造方法中, 就是獲取的方式, 重點是利用泛型然後使用反射裡的”getGenericSuperclass”方法, 就可以獲取到對應的型別 . 進而獲取對應的className .