1,什么是动态代理:

在程序的运行过程中创建出代理对象;用该对象间接实现相应的 接口和方法

2,动态代理的好处:

  1. 可以对功能进行增强拦截
  2. 且在多个接口的情况下,代理模式可以直接实现所有的接口;无需一一去使用 实现类 或 匿名内部类 去实现;简化代码,提供开发的效率;
  3. 动态代理的使用场景:

    1. 支付后的短信发送,支付功能的拓展等;

      3,代理模式的相关API:(Proxy类)三个参数;类名直接调用

      image.png

      4,代理模式的调用范例:

      ```java public class Text {

    public static void main (String[] args) {

    //向下转型;创建的对象会实现传入的接口 Animal newProxyInstance = (Animal) Proxy.newProxyInstance(

    1. //类加载器
    2. Text.class.getClassLoader(),
    3. //放入要实现的接口
    4. new Class[]{Animal.class},
    5. //执行处理器,给一个匿名内部类执行接口的方法;
    6. new InvocationHandler() {
    7. @Override
    8. //代理对象调用任何方法都会执行involve方法;
    9. public Object invoke (Object proxy, Method method, Object[] args) throws Throwable {
    10. return null;
    11. }
    12. }

    );

    //使用代理对象调用接口中的方法; newProxyInstance.setText1();

    }

}

//接口: public interface Animal {

  1. void setText1();
  2. void setText2();
  3. void setText3();

}

  1. <a name="rdQiO"></a>
  2. ## 5,动态代理模式对ArrayList的增强与拦截范例:
  3. ```java
  4. public class Text {
  5. public static void main (String[] args) {
  6. //创建真实对象list
  7. ArrayList <String> list = new ArrayList <>();
  8. //向下转型;创建的对象会实现传入的接口
  9. //移除所有黄色警告
  10. @SuppressWarnings ("all")
  11. List <String> newProxyInstance = (List <String>) Proxy.newProxyInstance(
  12. //类加载器
  13. Text.class.getClassLoader(),
  14. //实现的接口
  15. new Class[]{List.class},
  16. new InvocationHandler() {
  17. @Override
  18. //代理对象调用任何方法都会执行involve方法;
  19. public Object invoke (Object proxy, Method method, Object[] args) throws Throwable {
  20. //对方法进行拦截;
  21. if (method.getName().equals("remove")) {
  22. return null;
  23. } else {
  24. //对功能进行增强
  25. //输出时间
  26. Date date = new Date();
  27. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
  28. simpleDateFormat.format(date);
  29. //利用真实对象list调用方法
  30. //外面调用什么方法就要用什么方法;方法名通过args传入
  31. Object invoke = method.invoke(list, args);
  32. //要返回一个与方法返回值对应的返回值类型
  33. return invoke;
  34. }
  35. }
  36. }
  37. );
  38. //使用代理对象调用接口中的方法;
  39. newProxyInstance.add("等待");
  40. }
  41. }
  42. //接口:
  43. public interface List<T> {
  44. void add(String name);
  45. void remove(String a);
  46. void setText3();
  47. }