ParameterizedType获取java泛型参数类型
来源:互联网 发布:超级优化txt全集下载 编辑:程序博客网 时间:2024/06/08 20:02
这两天在看以前写的ssh项目时,遇到一个问题就是封装的BaseDaoImpl抽象类,构造方法里面是这样写的
Class<T> clazz;public BaseDaoImpl(){ ParameterizedType pt = (ParameterizedType)getClass().getGenericSuperclass(); clazz = (Class<T>)pt.getActualTypeArguments()[0];}看起来很复杂的样子,到底是什么意思呢?
ParameterizedType
(ParameterizedType)getClass().getGenericSuperclass()返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type,然后将其转换ParameterizedType。
返回表示此类型实际类型参数的 Type 对象的数组。[0]就是这个数组中第一个了。简而言之就是获得超类的泛型参数的实际类型看意思可能不是很懂,我们直接看例子
package com.chen.demo;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;class param<T1, T2> { class A {} class B extends A {} private Class<T1> entityClass; public param (){ Type type = getClass().getGenericSuperclass(); System.out.println("getClass() == " + getClass()); System.out.println("type = " + type); Type trueType = ((ParameterizedType)type).getActualTypeArguments()[0]; System.out.println("trueType1 = " + trueType); trueType = ((ParameterizedType)type).getActualTypeArguments()[1]; System.out.println("trueType2 = " + trueType); this.entityClass = (Class<T1>)trueType; System.out.println("entityClass = " + entityClass); B t = new B(); type = t.getClass().getGenericSuperclass(); System.out.println("B is A's super class :" + ((ParameterizedType)type).getActualTypeArguments().length); } } public class ClassDemo extends param<MyClass, MyInvoke>{ public static void main(String[] args) { ClassDemo classDemo = new ClassDemo(); }}package com.chen.demo;public class MyClass {}package com.chen.demo;public class MyInvoke {}
我们再看打印结果
getClass() == class com.chen.demo.ClassDemotype = com.chen.demo.param<com.chen.demo.MyClass, com.chen.demo.MyInvoke>trueType1 = class com.chen.demo.MyClasstrueType2 = class com.chen.demo.MyInvokeentityClass = class com.chen.demo.MyInvokeB is A's super class :0
从上面结果我们可以总结如下,通过ParameterizedType获取泛型参数Class类型,然后我们就可以通过Class干一系列事情了。。。。。
比如数据库基本CRUD的工具类,直接看工具代码如下:
public abstract class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> { Class<T> clazz; public BaseDaoImpl(){ //getClass().getGenericSuperclass()返回表示此 Class //所表示的实体(类、接口、基本类型或 void)的直接超类的 Type //然后将其转换ParameterizedType //getActualTypeArguments()返回表示此类型实际类型参数的 Type 对象的数组 //[0]就是这个数组中第一个了。 ParameterizedType pt = (ParameterizedType)getClass().getGenericSuperclass(); clazz = (Class<T>)pt.getActualTypeArguments()[0]; } @Override public void save(T entity) { getHibernateTemplate().save(entity); } @Override public void delete(Serializable id) { getHibernateTemplate().delete(findObjectById(id)); } @Override public void update(T entity) { getHibernateTemplate().update(entity); } @Override public T findObjectById(Serializable id) { return getHibernateTemplate().get(clazz, id); } @Override public List<T> findObjects() { Query query = (Query) getSession().createQuery("from " + clazz.getSimpleName()); return query.list(); } @Override public List<T> findObjects(QueryHelper queryHelper){ Query listQuery = getSession().createQuery(queryHelper.getHql()); List<Object> parameters = queryHelper.getParameters(); if(parameters != null){ for(int i = 0; i<parameters.size(); i++){ listQuery.setParameter(i, parameters.get(i)); } } return listQuery.list(); }}工具类用到了spring的orm模块,其次我们最重用的就是可以通过ParameterizedType封装通用的CRUD工具类,在实际的项目中,我们让不同的业务模块继承至该工具类,然后就可以直接使用其CRUD方法了。
转载自:http://blog.csdn.net/qq_18242391/article/details/54251947
阅读全文
0 0
- ParameterizedType获取java泛型参数类型
- ParameterizedType获取java泛型参数类型
- ParameterizedType获取java泛型参数类型
- ParameterizedType获取java泛型参数类型
- ParameterizedType获取java泛型参数类型
- ParameterizedType获取java泛型参数类型
- ParameterizedType获取java泛型参数类型
- ParameterizedType获取java泛型参数类型
- ParameterizedType获取java泛型参数类型
- ParameterizedType获取java泛型参数类型
- ParameterizedType获取java泛型参数类型
- 反射 ParameterizedType获取java泛型参数类型
- 利用ParameterizedType获取java泛型参数类
- 利用ParameterizedType获取java泛型参数类
- 泛型参数类型获取异常问题解决 java java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
- Java反射---getGenericSuperclass和ParameterizedType参数化类型的获取
- ParameterizedType getGenericSuperclass 获取泛型参数;class getClass区别
- ParameterizedType应用,java反射,获取参数化类型的class实例
- [C++]C++ Learn-Book
- jQuery--选择器
- ffmpeg/libavformat/tcp.c中getaddrinfo在IOS下的问题
- [开发]Github--Tool
- C语言——十进制转化为二进制
- ParameterizedType获取java泛型参数类型
- python基础
- 数据库SQL优化大总结之 百万级数据库优化方案
- Mac下JavaWeb开发环境搭建Tomcat+MyEclipse
- 使用VRTK在场景中实现传送 (四)
- [技巧]using STL
- Dependency Injection 依赖注入
- stl源码剖析 第三章iterator 和 type traits及POD类型
- 寻找集合的重要元素