利用反射实现泛型的实现
2015-12-28 15:35
267 查看
前三篇博客,有两篇分别是反射和泛型,但是在做网上商城的时候,见里边用到了BaseDao,里边也都是一些基本的增删该查的方法,但是有一点,如果我们调用底层的方法,就需要知道我们穿进去的是一个具体的说明类,这样的话才能根据实体去查询,还有就是我们要在BaseImpl中获得参数的实例,所以这个都是我们需要去实现的。但是如果我们写一个T t = new T(),程序一定会报错,那么我们要怎么写呢。
首先我们学习反射和泛型都是为了解耦合,提高代码的复用性,所以当我们把两者结合起来的时候,就是这个样子了,代码如下:
Base接口
public interface BaseDao<T>{
public Collection<T> getAllEntry();
public T getEntryById(Serializable id);
public void saveEntry(T t);
public void updateEntry(T t);
public void deleteEntry(Serializable id);
}
Base的实现
public class BaseDaoImpl<T> implements BaseDao<T>{
private Class classt;
/**
* 1、在父类中要执行一段代码,这个代码的执行时间为子类创建对象的时候,这段代码已经执行完了,根据这个需求,有两种方案供选择
* * 利用static语句块
* * 利用父类的构造函数
* 2、分析:
* 因为得到ParameterizedType需要用到this关键字,而this关键字不能出现在static语句块中
* 所以只能选择父类的构造器
*/
public BaseDaoImpl(){
/**
* ParameterizedType就是泛型
*/
ParameterizedType type = (ParameterizedType)this.getClass().getGenericSuperclass();
this.classt = (Class)type.getActualTypeArguments()[0];//<T>
System.out.println(this.classt);
System.out.println(type.getRawType() + "...................");
}
public HibernateTemplate hibernateTemplate;
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
public Collection<T> getAllEntry() {
return this.hibernateTemplate.find("from "+this.classt.getName());
}
public T getEntryById(Serializable id) {
return (T)this.hibernateTemplate.get(this.classt, id);
}
public void saveEntry(T t) {
this.hibernateTemplate.save(t);
}
public void updateEntry(T t) {
this.hibernateTemplate.update(t);
}
public void deleteEntry(Serializable id) {
T t = this.getEntryById(id);
this.hibernateTemplate.delete(t);
}
} 这样我们在我们的Dao层的实现就可以直接用力,例如:
public class DepartmentDaoImpl extends BaseDaoImpl<Department> implements DepartmentDao<Department>{
public void saveDepartment(Department department) {
// TODO Auto-generated method stub
this.saveEntry(department);
}
} 这几天就一直在研究这个人家是怎么封装的,因为以前就是会用,这次把这个好好的看一下,发现对这个代码的实现还是非常有帮组的,现在想想以前敲代码的过程,自己都有点忍不住笑话自己了。
首先我们学习反射和泛型都是为了解耦合,提高代码的复用性,所以当我们把两者结合起来的时候,就是这个样子了,代码如下:
Base接口
public interface BaseDao<T>{
public Collection<T> getAllEntry();
public T getEntryById(Serializable id);
public void saveEntry(T t);
public void updateEntry(T t);
public void deleteEntry(Serializable id);
}
Base的实现
public class BaseDaoImpl<T> implements BaseDao<T>{
private Class classt;
/**
* 1、在父类中要执行一段代码,这个代码的执行时间为子类创建对象的时候,这段代码已经执行完了,根据这个需求,有两种方案供选择
* * 利用static语句块
* * 利用父类的构造函数
* 2、分析:
* 因为得到ParameterizedType需要用到this关键字,而this关键字不能出现在static语句块中
* 所以只能选择父类的构造器
*/
public BaseDaoImpl(){
/**
* ParameterizedType就是泛型
*/
ParameterizedType type = (ParameterizedType)this.getClass().getGenericSuperclass();
this.classt = (Class)type.getActualTypeArguments()[0];//<T>
System.out.println(this.classt);
System.out.println(type.getRawType() + "...................");
}
public HibernateTemplate hibernateTemplate;
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
public Collection<T> getAllEntry() {
return this.hibernateTemplate.find("from "+this.classt.getName());
}
public T getEntryById(Serializable id) {
return (T)this.hibernateTemplate.get(this.classt, id);
}
public void saveEntry(T t) {
this.hibernateTemplate.save(t);
}
public void updateEntry(T t) {
this.hibernateTemplate.update(t);
}
public void deleteEntry(Serializable id) {
T t = this.getEntryById(id);
this.hibernateTemplate.delete(t);
}
} 这样我们在我们的Dao层的实现就可以直接用力,例如:
public class DepartmentDaoImpl extends BaseDaoImpl<Department> implements DepartmentDao<Department>{
public void saveDepartment(Department department) {
// TODO Auto-generated method stub
this.saveEntry(department);
}
} 这几天就一直在研究这个人家是怎么封装的,因为以前就是会用,这次把这个好好的看一下,发现对这个代码的实现还是非常有帮组的,现在想想以前敲代码的过程,自己都有点忍不住笑话自己了。
相关文章推荐
- Java反射随记
- JAVA泛型—— 3fe8 转
- JAVA泛型详解——转
- AS3中的反射(速记) 分析
- 编写高质量代码改善C#程序――使用泛型集合代替非泛型集合(建议20)
- C# 反射(Reflection)的用处分析
- C#通过反射创建自定义泛型
- C#泛型用法实例分析
- 通俗易懂的C#之反射教程
- C#根据反射和特性实现ORM映射实例分析
- C语言泛型编程实例教程
- 深入反射生成数组的详解
- C#利用反射来判断对象是否包含某个属性的实现方法
- C# 泛型的简单理解(安全、集合、方法、约束、继承)分享
- C#泛型Dictionary的用法实例详解
- C#利用反射技术实现去掉按钮选中时的边框效果
- C#泛型和反射实例解析
- C#泛型实例详解
- python反射
- Stack集合与枚举、泛型