在WEB开发中,用到三层架构中经常会遇到代码抽取的情况,例如在dao层中,我们需要对数据库的基本操作进行抽取例如这样,在抽取之前我们需要定义抽取类的接口:

public interface BaseDao<T> {

	public void save(T obj);
public void delete(T obj);
public void update(T obj);
public List<T> getAll();
public T getById(Serializable id); }

接口定义玩后我们需要定义接口的实现类了:

public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T>{

	//该方法用于注解注入SessionFactory对象
@Resource
public void setMySessionFactory(SessionFactory sessionFactory) {
super.setSessionFactory(sessionFactory);
} @Override
public void save(T obj) {
this.getHibernateTemplate().save(obj);
} @Override
public void delete(T obj) {
this.getHibernateTemplate().delete(obj);
} @Override
public void update(T obj) {
this.getHibernateTemplate().update(obj);
} @Override
public List<T> getAll() {
String hql="from "+clazz.getSimpleName();
List<T> list = (List<T>) this.getHibernateTemplate().find(hql);
return list;
} @Override
public T getById(Serializable id) { }
}

在实现类中增、删、改的方法很容易实现,但由于HibernateTemplate的get方法必须传入目标对象的Class对象,也就是get(Class<?> clazz,Serializable),由于该类是使用泛型表示“需要查询的对象类型”,那我们如何获得该类泛型的Class对象成为了关键。(虽然getById()方法也可以像getAll()方法一样采用HQL查询,但我们为了演示这个问题,所以不采用这个方法)

public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T>{

	//该字段保存当前类泛型的Class对象
private Class<T> clazz; public BaseDaoImpl() { //返回表示此 Class 所表示的实体的直接超类的 Type
ParameterizedType genericSuperclass = (ParameterizedType)this.getClass().getGenericSuperclass();
//获得本类声明的泛型数组(实际上只有一个)
Type[] actualTypeArguments = genericSuperclass.getActualTypeArguments(); clazz = (Class<T>)actualTypeArguments[0];
} //为了简介,这里省略前面已经给出实现过程的方法
............ @Override
public T getById(Serializable id) {
T t = this.getHibernateTemplate().get(clazz,id);
return t;
}
}

Java中获取类声明泛型的Class对象(WEB开发Dao层的抽取)的更多相关文章

  1. Java中获取类的运行时结构

    获取运行时类的完整结构 通过反射获取运行时类的完整结构 Field(属性).Method(方法).Constructor(构造器).Superclass(父类).Interface(接口).Annot ...

  2. Java 中获取类路径 classpath 的方法

    System.out.println("++++++++++++++++++++++++"); String path = System.getProperty("jav ...

  3. 095、Java中String类之不自动保存对象池操作

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  4. 093、Java中String类之字符串是匿名对象

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  5. Java中Class类详解、用法及泛化

    Java中Class类及用法 Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识,即所谓的RTTI.这项信息纪录了每个对象所属的类.虚拟机通常使用运行时类型信息选准正确方 ...

  6. Java中Class类及用法

    Java中Class类及用法 Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识,即所谓的RTTI.这项信息纪录了每个对象所属的类.虚拟机通常使用运行时类型信息选准正确方 ...

  7. 第四节:详细讲解Java中的类和面向对象思想

    前言 大家好,给大家带来详细讲解Java中的类和面向对象思想的概述,希望你们喜欢 类和面向对象 在Java中怎样理解对象,创建对象和引用:什么是引用,对于基础学习的同学,要深入了解引用.示例:Stri ...

  8. Java中的类反射

    一.反射的概念 : 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...

  9. Java中Object类hashCode的底层实现

    Java中Object类hashCode的底层实现 openjdk\jdk\src\share\native\java\lang\Object.c 42 static JNINativeMethod ...

  10. Java中String类为什么被设计为final?

    Java中String类为什么被设计为final   首先,String是引用类型,也就是每个字符串都是一个String实例.通过源码可以看到String底层维护了一个byte数组:private f ...

随机推荐

  1. 设置 BCompare 打开文件时的默认字符编码

    每次比对 .h .cpp 文件,BCompare总是默认以西欧字符编码打开文件,导致中文都变成乱码了,还需要手动的修改文件字符编码,这样才能正常的显示.非常的不方便 然后我们就需要设置默认的字符编码, ...

  2. 基于C语言的面向对象设计模式(持续更新)

    前言 首先这篇文章只是初步的尝试,不涉及过于高深的编程技巧:同时需要表明的是,面向对象只是一种思想,不局限于什么样的编程语言,不可否认的是基于面向对象特性而设计的语言确实要比面向过程式的语言更加容易进 ...

  3. 直播预告丨Hello HarmonyOS进阶系列课程重磅来袭,4月27日开播

    为了帮助初识HarmonyOS的开发者快速入门,我们曾推出Hello HarmonyOS系列一共5期课程(传送门:https://developer.huawei.com/consumer/cn/tr ...

  4. Thread.Suspend和Abort 的区别

    理解: 在C#中,Thread.Suspend是一个方法,用于暂停当前线程的执行.它会导致线程停止执行并进入挂起状态,直到调用Thread.Resume方法才能继续执行. 然而,Thread.Susp ...

  5. iOS的cer、p12格式证书解析监控

    之前博客写过直接解析ipa包获取mobileprovision文件来监控APP是否过期来,但APP的推送证书还没有做, 大家都知道,iOS的推送证书不会放到ipa包里,只能通过直接解析p12或cer. ...

  6. Ajax 原理是什么?如何实现?

    一.是什么 AJAX全称(Asynchronous Javascript And XML) 即异步的JavaScript 和XML,是一种创建交互式网页应用的网页开发技术,可以在不重新加载整个网页的情 ...

  7. javascript现代编程系列教程之X——javascript人工智能

    JavaScript 在人工智能(AI)领域的应用主要体现在以下几个方面: 浏览器端的机器学习:TensorFlow.js 是一个在浏览器中运行的 JavaScript 机器学习库,它允许开发者训练和 ...

  8. 力扣525(java&python)-连续数组(中等)

    题目: 给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度. 示例 1: 输入: nums = [0,1]输出: 2说明: [0, 1] 是具有相 ...

  9. 第五章:SQL高级处理

    第五章:SQL高级处理 5.1 窗口函数 5.1.1 窗口函数概念及基本的使用方法 窗口函数也称为OLAP函数.OLAP 是 OnLine AnalyticalProcessing 的简称,意思是对数 ...

  10. 智能数据构建与管理平台Dataphin的前世今生:缘起

    简介: 阿里巴巴提出的OneData方法论帮助企业捋清了数据全生命周期的管理思路,更将其植入到产品Dataphin(智能数据构建与管理)中,通过阿里云为企业提供服务. Dataphin 智能数据构建与 ...