package com.spring;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.hibernate.Session;
import org.hibernate.Transaction;
import cpm.util.HibernateSessionFactory;
public class SecurityHandler implements InvocationHandler {
//动态代理 实现InvocationHandler接口
private Object targetObject; //对传进来的目标对象进行代理
//newProxy生成动态代理对象 需要传进来目标对象
public Object newProxy(Object targetObject){
this.targetObject = targetObject; //传需要代理的目标对象
//返回代理对象 this表示本对象实现该代理
return Proxy.newProxyInstance(
targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(),
this);
}
//new该类的实例则默认自动调用invoke()方法
//proxy:代理对象 method:对象的方法 Object[] args:对象的参数
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// 安全性检查 事务处理
checkSecurity();
Session session = HibernateSessionFactory.getSession();
Transaction tr = session.beginTransaction();
//返回值 若不返回 则客户端拿不到返回值
Object result = null;
try{
//method表示方法如addUser() result为返回类型void为null
result = method.invoke(this.targetObject, args);
tr.commit();
}catch(Exception e){
tr.rollback();
e.printStackTrace();
throw new java.lang.RuntimeException(e);
}
return result;
}
//安全性检查
private void checkSecurity(){
System.out.println("------checkSecurity()-------");
}
}
//client
public class Client {
public static void main(String[] args) {
SecurityHandler handle = new SecurityHandler();
UserManager userManager = (UserManager)handle.newProxy(new UserManagerImpl());
userManager.addUser("谢孝章", "123456");
}
}