private Class<T> clazz;
public BaseDao(){
//初始化clazz属性
Type superType = this.getClass().getGenericSuperclass();//getGenericSuperclass:拿到调用者的父类类型
if(superType instanceof ParameterizedType){
ParameterizedType pt = (ParameterizedType) superType;
Type[] tarry = pt.getActualTypeArguments();//返回一个类型数组,第一个元素就是索要的类型
if(tarry[0] instanceof Class){
clazz = (Class<T>) tarry[0];
}
}
}
Type superType = this.getClass().getGenericSuperclass();
获取此Class所表示的对象的父类的类型,并转换为ParameterizedType
ParameterizedType pt = (ParameterizedType) superType;
getActualTypeArguments(): 返回表示此类型实际类型参数的Type对象的数组,第一个元素就是泛型参数的实际类型。
参考一个例子加以理解 原文:https://blog.csdn.net/qq_18242391/article/details/54251947
package com.chen.demo;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
class param<T1, T2> {
class A {}
class B extends A {}
private Class<T1> entityClass;
public param (){
Type type = getClass().getGenericSuperclass();
System.out.println("getClass() == " + getClass());
System.out.println("type = " + type);
Type trueType = ((ParameterizedType)type).getActualTypeArguments()[0];
System.out.println("trueType1 = " + trueType);
trueType = ((ParameterizedType)type).getActualTypeArguments()[1];
System.out.println("trueType2 = " + trueType);
this.entityClass = (Class<T1>)trueType;
System.out.println("entityClass = " + entityClass);
B t = new B();
type = t.getClass().getGenericSuperclass();
System.out.println("A is B's super class :" + ((ParameterizedType)type).getActualTypeArguments().length);
}
}
public class ClassDemo extends param<MyClass, MyInvoke>{
public static void main(String[] args) {
ClassDemo classDemo = new ClassDemo();
}
}
package com.chen.demo;
public class MyClass {
}
package com.chen.demo;
public class MyInvoke {
}
打印结果
getClass() == class com.chen.demo.ClassDemo
type = com.chen.demo.param<com.chen.demo.MyClass, com.chen.demo.MyInvoke>
trueType1 = class com.chen.demo.MyClass
trueType2 = class com.chen.demo.MyInvoke
entityClass = class com.chen.demo.MyInvoke
A is B's super class :0