反射泛型的使用

对于反射泛型的简单应用(有关泛型的知识请自行学习)!!!

在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;
		}

}
感谢传智播客的学习视频!!!


猜你喜欢

转载自blog.csdn.net/m0_37461645/article/details/79571068