动态代理(日志记录) /** * @author Administrator */ public class UserDaoProxy { /** * 目标对象 */ private IUserDao iUserDao = new UserDao(); /** * 日志对象 */ private Log log = new Log(); /** * @return 代理对象 */ public IUserDao getProxy(){ /** * 使用JDK中的Proxy创建代理对象, * 这个代理对象是程序动行时产生,因此叫动态代理 */ /** * * 参数一:代理对象是由哪个类加载器加载器 * 参数二:代理对象要与目标对象有相同的方法 * 参数三:在代理对象中,如何去处理客户端调用的方法 * */ return (IUserDao)Proxy.newProxyInstance( UserDaoProxy.class.getClassLoader(), iUserDao.getClass().getInterfaces(), new InvocationHandler(){ /** * 参数一:程序产生的动态代理对象本身,通常需要返回 * 参数二:客户端调用的业务方法 * 参数三:客户端调用的业务方法时传入的实际参数,第一个参数位于下标0的位置 * 返回值:表示在调用业务方法时的返回信息 * 客户端调用几次业务方法,invoke就会执行几次 */ public Object invoke(Object proxy, Method method,Object[] args) throws Throwable { //返回值 Object returnValue = ""; //获取客户端调用的方法名 String methodName = method.getName(); //如果客户端调用的方法是addUser的话 if("addUser".equals(methodName)){ //写日志 log.write(); //增加用户,并接收返回值 returnValue = method.invoke(iUserDao,args); //写日志 log.write(); }else{ //查询用户,并接收返回值,相当于iUserDao.addUser() returnValue = method.invoke(iUserDao,args); } //将返回值返回 return returnValue; } }); } }