对于反射泛型的简单应用(有关泛型的知识请自行学习)!!!
在web开发应用中,会遇到多种类拥有类似的操作,例如对数据库中的学生和教师都有查找所有人、根据ID查找某人的信息,此时可以利用反射泛型将类似操作提取出来成Base类,使得拥有Base类中的操作的类继承即可。
操作步骤:
1.以下是StudentDao与TeacherDao类的共有操作
2.提取出
具体实现
学生类:
public class StudentDao extends BaseDao<Student>{
}
教师类:
Public class TeacherDao extends BaseDao<Teacher>{
}
提取出来的共有类:
public class BaseDao<T>{
private Class targetClass; // 具体的dao上面的泛型类型
private String tableName; // 表名
// 创建类时获得继承类的类名
public BaseDao(){
/**
* 需要解决的问题:
* 约定:具体泛型类型的类名和表名保持一致
* 1) 得到具体的业务dao运行过程中的泛型具体类型(Student/Teacher),可以封装ResultSet
* 2) 得到泛型具有类型名称,就是表名
*/
// 1) this:代表当前运行的dao对象 this.class:代表当前运行dao对象的class对象
Class clazz = this.getClass(); // public class TeacherDao extends BaseDao<Teacher>
// 2) clazz.getGenericSuperclass(); 得到当前dao对象的父类(参数化类型)
Type type = clazz.getGenericSuperclass(); // BaseDao<Teacher,?,?...>
ParameterizedType param = (ParameterizedType)type;
// 3) 得到参数化类型 上面的泛型类型列表 <Teacher,?,?...>
Type[] types = param.getActualTypeArguments();
// 4) 取出泛型类型列表中想要的的类型 Teacher
Type target = types[0];
// 5) 强制转 Class类型
targetClass = (Class) target;
tableName = targetClass.getSimpleName().toLowerCase();
}
public List<T> findAll(){
// 数据库操作 类:targetClass 表:tableName
return list;
}
public T findById(int id) {
// 数据库操作 类:targetClass 表:tableName
return T;
}
}
感谢传智播客的学习视频!!!