Java中获取类声明泛型的Class对象(WEB开发Dao层的抽取)
在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层的抽取)的更多相关文章
- Java中获取类的运行时结构
		
获取运行时类的完整结构 通过反射获取运行时类的完整结构 Field(属性).Method(方法).Constructor(构造器).Superclass(父类).Interface(接口).Annot ...
 - Java 中获取类路径 classpath 的方法
		
System.out.println("++++++++++++++++++++++++"); String path = System.getProperty("jav ...
 - 095、Java中String类之不自动保存对象池操作
		
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
 - 093、Java中String类之字符串是匿名对象
		
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
 - Java中Class类详解、用法及泛化
		
Java中Class类及用法 Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识,即所谓的RTTI.这项信息纪录了每个对象所属的类.虚拟机通常使用运行时类型信息选准正确方 ...
 - Java中Class类及用法
		
Java中Class类及用法 Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识,即所谓的RTTI.这项信息纪录了每个对象所属的类.虚拟机通常使用运行时类型信息选准正确方 ...
 - 第四节:详细讲解Java中的类和面向对象思想
		
前言 大家好,给大家带来详细讲解Java中的类和面向对象思想的概述,希望你们喜欢 类和面向对象 在Java中怎样理解对象,创建对象和引用:什么是引用,对于基础学习的同学,要深入了解引用.示例:Stri ...
 - Java中的类反射
		
一.反射的概念 : 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...
 - Java中Object类hashCode的底层实现
		
Java中Object类hashCode的底层实现 openjdk\jdk\src\share\native\java\lang\Object.c 42 static JNINativeMethod ...
 - Java中String类为什么被设计为final?
		
Java中String类为什么被设计为final 首先,String是引用类型,也就是每个字符串都是一个String实例.通过源码可以看到String底层维护了一个byte数组:private f ...
 
随机推荐
- MogDB/openGauss关于PL/SQL匿名块调用测试
			
MogDB/openGauss 关于 PL/SQL 匿名块调用测试 一.原理介绍 PL/SQL(Procedure Language/Structure Query Language)是标准 SQL ...
 - redis 简单整理——开发和运维中的问题[二十四]
			
前言 简单介绍一下开发和运维中的问题. 正文 从上文中介绍了,我们有了一个副本了,通过复制的方式. 这些副本可以应用于读写分 离.故障转移(failover).实时备份等场景. 那么可以关注一些开发和 ...
 - centos 虚拟机修改mac和ip地址
			
前言 因为网上过于零散,故而整理.在此我用的是vm虚拟机. 正文 在我们安装好vm虚拟机后,我们会获得两个虚拟网卡. 那么我们获得两个虚拟网卡后,这两个网卡到底是什么呢?那么我们打开vm的虚拟网络编辑 ...
 - css test-align 和 margin 居中什么区别
			
共同点 test-align 和margin 都可以居中: test-align:Center. margin: 0 auto. 很好但是看下区别: <div style="backg ...
 - navicat连接mysql8报错
			
mysql8采用更安全的加密方式,navicat不支持,网上大多办法都是采用的更改数据库加密方式为外部加密 个人觉得这样它不太合适 so,终于找到一个办法: 把mysql8安装后的lib文件夹里的 l ...
 - 基于 K8s 的交付难题退退退!| 独家交付秘籍(第三回)
			
简介: 经过仔细研究,我们发现秘籍中提到许多帮助解决交付问题的招式,而其中一个让我们印象很深,是关于在原有社区版容器底座 Kubernetes(以下简称 K8s)的基础上,对容器底座进行改进,可更好的 ...
 - 从KPI到OKR,高阶产品人如何推动业务高速增长
			
简介: 不管是核心大目标,还是O(Objectives),或者北极星指标,奇妙等式等等,最后都需要核心组织协同方式来推动整个目标聚焦以及过程的落地. 作为产品经理人,相信很多人都遇到过以下的灵魂拷问: ...
 - ADBPG&Greenplum成本优化之磁盘水位管理
			
简介:本文我们将通过一个实际的磁盘空间优化案例来说明,如何帮助客户做成本优化.  作者 | 玉翮 来源 | 阿里技术公众号 一 背景描述 目前,企业的核心数据一般都以二维表的方式存储在数据库中.在 ...
 - [Mobi] Android Studio arm 模拟器
			
从右下角 Configure 打开 AVD Manager. 点击 "Create New Device" 来创建新设备 选择TV 接着Next,然后用 Other Imag ...
 - [FAQ] Error: Component series.bar not exists. Load it first. (echarts)
			
以上错误出现在使用 echarts 组件时,未导入或者使用不正确的情况下. 检查是否导入 line 或者 bar 这一类具体的 chart,比如: import 'echarts/lib/chart/ ...