如果在父类中想要获取泛型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
打印除了真的泛型的类的类型