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

    2、编写JDK动态代理代码
    ①创建接口,定义方法
    image.png

    ②创建接口实现类,实现方法
    image.png
    ③使用Proxy类创建接口代理对象
    image.png
    image.png

    JDKProxy类的代码

    1. package com.atguigu.spring5;
    2. import java.lang.reflect.InvocationHandler;
    3. import java.lang.reflect.Method;
    4. import java.lang.reflect.Proxy;
    5. import java.util.Arrays;
    6. /**
    7. * @author Dxkstart
    8. * @create 2021-10-26-19:29
    9. */
    10. public class JDKProxy {
    11. public static void main(String[] args) {
    12. //创建接口实现类的代理对象
    13. Class[] interfaces = {UserDao.class};
    14. /*
    15. Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new InvocationHandler() {
    16. @Override
    17. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    18. return null;
    19. }
    20. });*/
    21. UserDaoImpl userDao = new UserDaoImpl();
    22. UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));
    23. // int result = dao.add(1, 2);//执行add方法增强逻辑后的方法
    24. // System.out.println("result:" + result);
    25. System.out.println(dao.update("12"));//执行update方法增强逻辑后的方法
    26. }
    27. }
    28. //创建代理对象的代码
    29. class UserDaoProxy implements InvocationHandler{
    30. //1.创建的是谁的代理对象,就需要把谁传递过来(这里创建的是UserDaoImpl的代理对象)
    31. //通过有参构造进行传递
    32. private UserDaoImpl userDaoImpl;
    33. public UserDaoProxy(UserDaoImpl userDaoImpl){
    34. this.userDaoImpl = userDaoImpl;
    35. }
    36. //在invoke中写需要增强的逻辑
    37. @Override
    38. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    39. //方法之前的逻辑
    40. System.out.println("方法之前执行~" + method.getName() + ":传递的参数是:" + Arrays.toString(args));
    41. //被增强的方法执行
    42. Object res = method.invoke(userDaoImpl, args);
    43. //方法之后的逻辑
    44. if (method.getName().equals("add")){
    45. System.out.println("add方法之后执行~" + userDaoImpl);
    46. }else {
    47. System.out.println("执行update方法之后的逻辑");
    48. }
    49. return res;
    50. }
    51. }