首先需要一个定义一个通用的JavaBean
定义一个私有属性类泛型,用来指定具体类
example:(这里做父类)
public class BaseDao<T> implements Serializable {
private static final long serialVersionUID = 4723300389545055582L;
private Class<T> clazz; // T的具体类
/**
* 通过构造方法指定DAO的具体实现类 利用反射机制,获取具体实现类
* getGenericSuperclass() 返回父类的type,转换成ParameterizedType
* getActualTypeArguments()
返回表示此类型实际类型参数的 Type 对象的数组,[0]获得超类的泛型参数的具体类型。
*
*/
public BaseDao() {
ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
clazz = (Class<T>) type.getActualTypeArguments()[0];
System.out.println("DAO的真实实现类是:" + this.clazz.getName());
}
public void hello(){
System.out.println("say Hello");
}
}
注:getClass需使用getGenericSuperclass,这样可以获得泛型的具体类
实体类
package com.practice;
public class Giraffe {
}
(这里做子类)
package com.practice;
public class Zoo extends BaseDao<Giraffe>{
public void dos() {
super.hello();
}
}
测试:
package com.practice;
public class demo1 {
public static void main(String[] args) {
System.out.println("Hi ");
Zoo zoo = new Zoo();
zoo.dos();
}
使用方式:我们在子类调用父类的方法时,通过类的一个加载机制,将父类初始化,再通过构造,父类就获取到了具体的实现类