如果在父類中想要獲取泛型T的類型
T.class;
T.getClass();
這兩種方法都是無法實現的,因爲泛型T不是一個真正的類或者實例
下面的代碼將介紹如何通過反射獲得泛型T的真實的類的類型
import java.lang.reflect.ParameterizedType;
@SuppressWarnings("unchecked")
public class Base<T> {
/**
* 如果在父類中想要獲取泛型T的類型
* T.class;
* T.getClass();
* 這兩種方法都是無法實現的,因爲泛型T不是一個真正的類或者實例
*/
private Class<T> clazz;
// 通過反射技術,獲取泛型類的真實類型
public Base() {
ParameterizedType pt = (ParameterizedType) this.getClass()
.getGenericSuperclass();// 這裏面的this代表的是子類的實例
this.clazz = (Class<T>) pt.getActualTypeArguments()[0];// 獲取第一個類型參數的真實類型
System.out.println("---> clazz : " + this.clazz);
}
}
public class User extends Base<User> {
}
public class Role extends Base<Role> {
}
import org.junit.Test;
public class TestGeneric {
@Test
public void test(){
User user = new User();
Role role = new Role();
}
}
輸出:
---> clazz : class User
---> clazz : class Role
打印除了真的泛型的類的類型