readme

  1. 代理模式:
  2. 真实对象:被代理的对象
  3. 代理对象:就是代理对象
  4. 代理模式:代理对象代理真实对象,达到增强真实对象功能目的
  5. 实现方式:
  6. 动态代理:
  7. 1、代理对象和真实对象实现相同的接口
  8. 2、代理对象 = Proxy.newProxyInstance()
  9. 3、使用代理对象调用方法
  10. 4、增强方法
  11. 增强方式:
  12. 1、增强参数列表
  13. 2、增强返回值类型
  14. 3、增强方法体逻辑

demo-代理商+原厂卖手机

接口

  1. package com.example.newyear.proxy;
  2. public interface SalePhone {
  3. public String sale(double maney);
  4. public void show();
  5. }

真实类

  1. package com.example.newyear.proxy;
  2. /**
  3. * 真实类
  4. */
  5. public class lenovo implements SalePhone{
  6. @Override
  7. public String sale(double maney) {
  8. System.out.println("花了"+maney+"买了一台电脑");
  9. return "lenove pc";
  10. }
  11. @Override
  12. public void show() {
  13. System.out.println("展示电脑....原价8000");
  14. }
  15. }

代理测试类

  1. package com.example.newyear.proxy;
  2. import java.lang.reflect.InvocationHandler;
  3. import java.lang.reflect.Method;
  4. import java.lang.reflect.Proxy;
  5. /**
  6. * 代理测试类
  7. */
  8. public class Proxytest {
  9. public static void main(String[] args) {
  10. //创建真实对象
  11. lenovo lno = new lenovo();
  12. //动态代理增强lno对象 底层:反射一个实现相同接口的类,这个新类的方法里面包含了对旧类方法的引用,使用这个新类实例化一个对象
  13. // 这个方法会返回一个代理对象
  14. // 固定写法 传入lno对象的类加载器和所有接口
  15. /**
  16. * 三个参数:
  17. * 1、类加载器:真实对象.getClass().getClassLoader()
  18. * 2、接口数组:真实对象.getClass().getInterfaces() 保证代理对象和真实对象实现了相同的接口
  19. * 3、处理器:new InvocationHandler() 核心业务的处理
  20. *
  21. * 因为代理对象和真实对象都是实现SalePhone接口,所以可以直接强转,方便阅读
  22. */
  23. SalePhone proxy_lno = (SalePhone) Proxy.newProxyInstance(lno.getClass().getClassLoader(), lno.getClass().getInterfaces(), new InvocationHandler() {
  24. /**
  25. * 代理逻辑里面写的方法:代理对象调用的所有方法都会触发该方法执行
  26. * @param proxy :代理对象,就是上面的proxy_lno
  27. * @param method : 代理对象调用哪个方法,就会把哪个方法通过反射封装成对象传入
  28. * @param args :代理对象调用的方法时,传递的实际参数
  29. * @return
  30. * @throws Throwable
  31. */
  32. @Override
  33. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  34. // System.out.println("代理逻辑中的方法执行了");
  35. // System.out.println(method.getName());
  36. // System.out.println(args[0]);
  37. //代理对象只是增强真实对象的,因此这里面需要使用真实对象调用方法进行执行 而方法已经通过虚拟对象传入method中了
  38. //方法被真实对象执行
  39. // Object obj = method.invoke(lno, args);
  40. //使用真实对象调用方法执行后,返回的结果,这里return是给到代理对象,所以下面的pc=obj
  41. // return obj;
  42. //上面那部分需要好好理解,可以把注释去掉,运行进行理解,但是记得注释下面这部分
  43. //案例:比如供应商(代理对象),代理卖联想的电脑,卖出价格是进价的1.1
  44. // 判断是否是sale方法,如果不是sale方法,就不会触发
  45. if (method.getName().equals("sale")){
  46. //增强参数
  47. double maney = (double) args[0];
  48. maney = maney*1.1;
  49. //增强方法体
  50. System.out.println("客户");
  51. Object obj = method.invoke(lno, maney);
  52. System.out.println("客户血赚");
  53. //增强返回值
  54. return "因为"+obj+"送了鼠标";
  55. }else {
  56. Object obj = method.invoke(lno, args);
  57. return obj;
  58. }
  59. }
  60. });
  61. //使用代理对象调用真实类中的方法
  62. String pc = proxy_lno.sale(8000);
  63. System.out.println(pc);
  64. // proxy_lno.show();
  65. }
  66. }

通过代理,可以对真实对象进行增强,输出了更多的内容
image.png