day39-Spring 03-JDK的动态代理

package cn.itcast.spring3;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * JDK的动态代理的机制
 * @author zhongzh
 *
 */
public class JDKProxy implements InvocationHandler{//写了一个代理对象
     private UserDao userDao;//持有被代理对象的引用

    public JDKProxy(UserDao userDao) {//在构造的时候传入被代理对象
        super();
        this.userDao = userDao;
    }
    public  UserDao createProxy(){//对接口生成代理,返回被代理接口的代理
        UserDao proxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(), this);//InvocationHandler这里也可以使用匿名内部类
        
        return proxy;
        
    }
    //调用目标对象的任何一个方法都相当于调用invoke();这个方法都会执行.
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        // TODO Auto-generated method stub
        if("add".equals(method.getName())){//增强add()方法
            //记录日志
            System.out.println("日志记录=============================================");//如果方法名是add(),记录日志
             Object result = method.invoke(userDao, args);//记录日志之后执行添加用户的代码
             //如果是add()方法那么在add()方法之前做了一个事情然后才执行add()方法.
             return result;
        }
        return method.invoke(userDao, args);
    }
}
package cn.itcast.spring3;
/**
 * DAO的接口
 * @author zhongzh
 *
 */
public interface UserDao {
    public void add();
    public void update();
    
}
package cn.itcast.spring3;

public class UserDaoImpl implements UserDao {

    public void add() {
        // TODO Auto-generated method stub
        System.out.println("添加用户....");
    }

    public void update() {
        // TODO Auto-generated method stub
         System.out.println("修改用户.....");
    }

}
package cn.itcast.spring3;

import org.junit.Test;

public class SpringTest1 {
    @Test
    public void demo1(){
        UserDao userDao = new UserDaoImpl();
        userDao.add();
        userDao.update();
    }
    @Test
    public void demo2(){
        UserDao userDao = new UserDaoImpl();
        UserDao proxy = new JDKProxy(userDao).createProxy();
        proxy.add();
        proxy.update();
}
}

原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/6773652.html