1、使用 JDK 动态代理,使用 Proxy 类里面的方法创建代理对象
    image.png
    (1)调用 newProxyInstance 方法
    image.png
    方法有三个参数:
    第一参数,类加载器。
    第二参数,增强方法所在的类,这个类实现的接口,支持多个接口。
    第三参数,实现这个接口 InvocationHandler,创建代理对象,写增强的部分。

    2、编写 JDK 动态代理代码
    (1)创建接口,定义方法

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

    (2)创建接口实现类,实现方法

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

    (3)使用 Proxy 类创建接口代理对象

    1. public class JDKProxy {
    2. public static void main(String[] args) {
    3. //创建接口实现类代理对象
    4. Class[] interfaces = {UserDao.class};
    5. // Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new InvocationHandler() {
    6. // @Override
    7. // public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    8. // return null;
    9. // }
    10. // });
    11. UserDaoImpl userDao = new UserDaoImpl();
    12. UserDao dao =
    13. (UserDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));
    14. int result = dao.add(1, 2);
    15. System.out.println("result:"+result);
    16. } }
    1. //创建代理对象代码
    2. class UserDaoProxy implements InvocationHandler {
    3. //1 把创建的是谁的代理对象,把谁传递过来
    4. //有参数构造传递
    5. private Object obj;
    6. public UserDaoProxy(Object obj) {
    7. this.obj = obj;
    8. }
    9. //增强的逻辑
    10. @Override
    11. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    12. //方法之前
    13. System.out.println("方法之前执行...."+method.getName()+" :传递的参数..."+ Arrays.toString(args));
    14. //被增强的方法执行
    15. Object res = method.invoke(obj, args);
    16. //方法之后
    17. System.out.println("方法之后执行...."+obj);
    18. return res;
    19. }
    20. }