JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
反射机制在开发中是一个非常重要的机制。比如说在一些项目中,为了达到代码的重用我们可能会抽取公共的方法到基类或者接口当中去,但是使用这些公共的方法的类有很多,这就需要我们使用泛化,但是在泛化的过程中,我们可能会使用泛化类做一些操作,但是泛化类毕竟不是具体的类,那么我们怎么办呢,这时候反射机制就会帮助我们解决这个问题。
public abstract class BaseDaoImpl<T> implements BaseDao<T> {
@Resource
private SessionFactory sessionFactory;
protected Class<T> clazz;
public BaseDaoImpl() {
// 通过反射得到T的真实类型
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();//获得类型的父类
this.clazz = (Class) pt.getActualTypeArguments()[0]; //获得本类的类型,即T的类型
}
public void delete(Long id) {
Object obj = getSession().get(clazz, id);//这个地方的clazz就是需要我们在构造函数中通过反射机制或者实际的类类型,下面的clazz也是
getSession().delete(obj);
}
public T getById(Long id) {
if (id == null) {
return null;
}
return (T) getSession().get(clazz, id);
}
public List<T> getByIds(Long[] ids) {
if (ids == null || ids.length == 0) {
return Collections.EMPTY_LIST;
}
return getSession().createQuery(//
"FROM " + clazz.getSimpleName() + " WHERE id IN(:ids)")//
.setParameterList("ids", ids)//
.list();
}
public List<T> findAll() {
return getSession().createQuery(//
"FROM " + clazz.getSimpleName())//
.list();
}
/**
* 获取当前可用的Session
*
* @return
*/
protected Session getSession() {
return sessionFactory.getCurrentSession();
}
}