public class UserDao { public void add(){ System.out.println("添加用户"); } public void delete(){ System.out.println("删除用户"); } } |
public class UserDaoUtils { private UserDao ud = new UserDao(); public void add(){ System.out.println("开启事务"); ud.add(); System.out.println("提交事务"); } } |
public interface Dao { void add(); void delete(); } public class UserDao implements Dao{ @Override public void add(){ System.out.println("添加用户"); } @Override public void delete() { System.out.println("删除用户"); } } public class UserDaoUtils implements Dao { UserDao ud = new UserDao(); @Override public void add() { System.out.println("开启事务"); ud.add(); System.out.println("提交事务"); } @Override public void delete() { System.out.println("开启事务"); ud.delete(); System.out.println("提交事务"); } } |
Proxy newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。 |
public class ProxyUtils { static UserDao ud = new UserDao(); /** * 动态代理面向接口 * 因为只有接口 才能规范 代理对象和被代理对象 的方法是一样的 * * 动态代理 也是为产生一个中间类的对象 * * */ public static Object getProsxyObject(){ /** * 第一个参数主要是为了获取被代理对象 * * 第二个参数 主要是为了让中间类对象(代理对象) 有着 跟被代理对象一样方法 * * 第三个参数 就是为了增强被代理的方法 (首先要拦截代理对象执行的方法) * */ Dao d = (Dao)Proxy.newProxyInstance(ud.getClass().getClassLoader(), new Class[]{Dao.class}, new InvocationHandler() { /** * Object o 代理对象 *Method method 当前 代理对象执行的方法 * Object[] objects 当前执行方法 上面的参数 * */ @Override public Object invoke(Object o, Method method, Object[] objects) throws Throwable { // Object o = method.invoke(obj,args); /* System.out.println(method); System.out.println(Arrays.toString(objects)); System.out.println("---");*/ System.out.println("开启事务"); Object obj = method.invoke(ud,objects); System.out.println("提交事务"); return obj; } }); //代理对象被调用的时候 才会执行 return d; } public static void main(String[] args) { //代理对象 Dao d = (Dao)getProsxyObject(); // d.add(); String test = d.update("test"); System.out.println(test); } |
} |
当代理对象执行一个方法的时候,他会进入到InvocationHandler里面的public Object invoke(Object o, Method method, Object[] objects) throws Throwable{ }的方法里面,我们对这个方法的参数做一个说明: |
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |