package com.util;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
public class DaoProxy implements InvocationHandler{
private static SessionFactory factory;
static{
Configuration cfg = new Configuration().configure();
ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
factory = cfg.buildSessionFactory(sr);
}
private Object targetObj;
public DaoProxy(Object targetObj) {
this.targetObj = targetObj;
}
/**
* @Title : getProxy
* @Description : TODO 代理对象
* @param : @return
* @return : Object
* @throws
*/
public Object getProxy(){
return Proxy.newProxyInstance(targetObj.getClass().getClassLoader(),
targetObj.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
Session session = factory.openSession();
//得到目标对象的session属性对象
Field f = targetObj.getClass().getDeclaredField("session");
//去掉修饰符检查
f.setAccessible(true);
//给目标对象的session属性赋值
f.set(targetObj, session);
try{
//开启事务
session.beginTransaction();
//执行目标方法,得到目标方法的返回值
Object returnObj = arg1.invoke(targetObj, arg2);
//提交事务
session.getTransaction().commit();
return returnObj;
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
session.close();
}
return null;
}
}