获取范型类的子类的实际类型的方法
2014-09-04 15:57
246 查看
package cn.itcast.oa.base;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import javax.annotation.Resource;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
@SuppressWarnings("unchecked")
public abstract class BaseDaoImpl<T> implements BaseDao<T> {
@Resource
private SessionFactory sessionFactory;
private Class<T> clazz; //这是一个问题,等待解决
public BaseDaoImpl(){
//使用反射技术得到T的真实类型
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();//获取当前new的对象的泛型的父类类型
this.clazz = (Class<T>) pt.getActualTypeArguments()[0];//获取第一个类型参数的类型
System.out.println("clazz-->"+this.clazz);
}
/**
* 得到Session
*
* @return
*/
protected Session getSession(){
return sessionFactory.getCurrentSession();
}
@Override
public void save(T entity) {
getSession().save(entity);
}
@Override
public void update(T entity) {
getSession().update(entity);
}
@Override
public void delete(Long id) {
Object obj = getById(id);
if(obj != null){
getSession().delete(obj);
}
}
@Override
public T getById(Long id) {
return (T) getSession().get(clazz, id);
}
@Override
public List<T> getByIds(Long[] ids) {
return getSession().createQuery(//
"FROM " +clazz.getSimpleName()+ " WHERE id IN (:ids)")//
.setParameterList("ids", ids)//
.list();
}
@Override
public List<T> findAll() {
return getSession().createQuery(//
"FROM " + clazz.getSimpleName())//
.list();
}
}
//=================第二个例子========================//
package cn.itcast.oa.base;
import java.lang.reflect.ParameterizedType;
import javax.annotation.Resource;
import cn.itcast.oa.domain.Department;
import cn.itcast.oa.service.DepartmentService;
import cn.itcast.oa.service.RoleService;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T>{
//===============ModelDriven的支持======================//
protected T model;
public BaseAction(){
try{
//通过反射得到model的真实实例
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
Class<T> clazz = (Class<T>) pt.getActualTypeArguments()[0];
model = clazz.newInstance();
}catch(Exception e){
throw new RuntimeException(e);
}
}
@Override
public T getModel() {
return model;
}
//===============Service实例的声明======================//
@Resource
protected DepartmentService departmentService;
@Resource
private RoleService roleService;
}
import java.lang.reflect.ParameterizedType;
import java.util.List;
import javax.annotation.Resource;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
@SuppressWarnings("unchecked")
public abstract class BaseDaoImpl<T> implements BaseDao<T> {
@Resource
private SessionFactory sessionFactory;
private Class<T> clazz; //这是一个问题,等待解决
public BaseDaoImpl(){
//使用反射技术得到T的真实类型
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();//获取当前new的对象的泛型的父类类型
this.clazz = (Class<T>) pt.getActualTypeArguments()[0];//获取第一个类型参数的类型
System.out.println("clazz-->"+this.clazz);
}
/**
* 得到Session
*
* @return
*/
protected Session getSession(){
return sessionFactory.getCurrentSession();
}
@Override
public void save(T entity) {
getSession().save(entity);
}
@Override
public void update(T entity) {
getSession().update(entity);
}
@Override
public void delete(Long id) {
Object obj = getById(id);
if(obj != null){
getSession().delete(obj);
}
}
@Override
public T getById(Long id) {
return (T) getSession().get(clazz, id);
}
@Override
public List<T> getByIds(Long[] ids) {
return getSession().createQuery(//
"FROM " +clazz.getSimpleName()+ " WHERE id IN (:ids)")//
.setParameterList("ids", ids)//
.list();
}
@Override
public List<T> findAll() {
return getSession().createQuery(//
"FROM " + clazz.getSimpleName())//
.list();
}
}
//=================第二个例子========================//
package cn.itcast.oa.base;
import java.lang.reflect.ParameterizedType;
import javax.annotation.Resource;
import cn.itcast.oa.domain.Department;
import cn.itcast.oa.service.DepartmentService;
import cn.itcast.oa.service.RoleService;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T>{
//===============ModelDriven的支持======================//
protected T model;
public BaseAction(){
try{
//通过反射得到model的真实实例
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
Class<T> clazz = (Class<T>) pt.getActualTypeArguments()[0];
model = clazz.newInstance();
}catch(Exception e){
throw new RuntimeException(e);
}
}
@Override
public T getModel() {
return model;
}
//===============Service实例的声明======================//
@Resource
protected DepartmentService departmentService;
@Resource
private RoleService roleService;
}
相关文章推荐
- 泛型子类获取父类的模板类型方法
- 关于获取泛型的实际类型的方法
- c#中 Enum类型定义与获取值或描述方法
- 获取字符串格式日期的年月日以及转换为TimeStamp类型的方法
- java设计模式---Template Method模板方法---实际处理交给子类
- Java利用反射来获取一个方法的 范型化参数 Vector<Integer>的类型
- Java利用反射来获取一个方法的 范型化参数 Vector<Integer>的类型
- *关于如何获取指定表的指定字段的数据类型的方法
- js中获取指定ID元素方法和指定类型元素的方法
- 利用Javassist获取Java类中的方法参数名、参数类型、方法访问类型
- Reflection中对于out类型的获取的另外一种方法
- 跳过编译器,获取泛型参数的实际类型
- ActionScript3.0中获取变量类型的方法
- C++宏在子类类型“识别”的一种方法
- Unity的AOP拦载,获取方法名,参数值,返回类型
- perl获取字段类型方法
- c#中Enum类型定义与获取值或描述方法- 半语小马哥- CSDNBlog
- ASP.NET 获取客户端浏览器类型、版本号方法!
- static的方法和变量,只与当前类型有关,和当前对象实际new无关
- Java获取文件类型Mime Type的各种方法