1. 使用JDK动态代理,

调用如下方法

  1. public static Object newProxyInstance(ClassLoader loader,
  2. Class<?>[] interfaces,
  3. InvocationHandler h)
  4. throws IllegalArgumentException

方法有三个参数
loader - 定义代理类的类加载器
interfaces - 代理类要实现的接口列表
h - 指派方法调用的调用处理程序

2、编写代码

1、创建一个接口

  1. package com.daijunyi.dao;
  2. public interface UserDao {
  3. public int add(int a,int b);
  4. public String update(String id);
  5. }

2、创建一个接口实现类

  1. package com.daijunyi.dao;
  2. public class UserDaoImp implements UserDao {
  3. @Override
  4. public int add(int a, int b) {
  5. return a+b;
  6. }
  7. @Override
  8. public String update(String id) {
  9. return id;
  10. }
  11. }

3、写代理

  1. package com.daijunyi.test;
  2. import com.daijunyi.dao.UserDao;
  3. import com.daijunyi.dao.UserDaoImp;
  4. import java.lang.reflect.InvocationHandler;
  5. import java.lang.reflect.Method;
  6. import java.lang.reflect.Proxy;
  7. public class JDKProxy {
  8. public static void main(String[] args) {
  9. Class[] interfaces = {UserDao.class};
  10. UserDaoImp userDaoImp = new UserDaoImp();
  11. UserDaoProxy userDaoProxy = new UserDaoProxy(userDaoImp);
  12. UserDao userDao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, userDaoProxy);
  13. userDao.add(1,2);
  14. userDao.update("11");
  15. }
  16. }
  17. class UserDaoProxy implements InvocationHandler{
  18. private Object obj;
  19. public UserDaoProxy(Object obj) {
  20. this.obj = obj;
  21. }
  22. //增强的逻辑
  23. @Override
  24. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  25. //方法之前
  26. System.out.println("方法之前执行:"+method.getName()+":传递参数:"+args.toString());
  27. //原来方法执行
  28. System.out.println("原来方法执行:"+method.getName()+":传递参数:"+args.toString());
  29. Object invoke = method.invoke(this.obj, args);
  30. //方法之后
  31. System.out.println("方法之后执行:"+method.getName()+":传递参数:"+args.toString());
  32. return invoke;
  33. }
  34. }