4.4 Java之动态代理(反射应用)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lwz45698752/article/details/85916224

动态代理概述

在这里插入图片描述

  • 由代理类决定何时及如何调用被代理类
  • 被代理类要完成接口定义的功能——》创建代理类,实现接口(不同接口则要不同的代理类)
  • 编译期不用确定代理类类型,运行时根据被代理类动态创建代理类
  • 被代理类实现某接口——》代理类动态实现该接口——》代理目标对象

静态代理实例

在这里插入图片描述

在这里插入图片描述

  • 声明是接口类型,实际传入被代理类对象,进行实例化

在这里插入图片描述

  • 参考接口章节
  • 新的接口——》创建接口实现类(目标类,即被代理类)——》创建代理类(同样实现接口)
  • 代理类和被代理类配套使用(都实现某接口)

动态代理实例

在这里插入图片描述

在这里插入图片描述

  • 关注一个接口和类的一个静态方法
  • 通过Proxy的静态方法来动态形式返回代理类,在该静态方法中,动态获取接口和类加载器,使得二者相同,最后一个参数要求是实现了特定接口(InvocationHandler)的一个对象
  • 动态创建——》不知道接口定义的抽象方法——》通过invoke方法实现
  • 所谓动态代理,指的是动态创建代理类,而不是直接实现接口来创建一个代理类
  • invoke方法的返回值即method方法的返回值
  • 调用obj对象相应的方法,即method

在这里插入图片描述

  • 每当代理类对象(sub/proxyCloth)调用被重写的方法(action/productCloth)时,转化为对invoke方法的调用(换句话说,调用invoke方法实际上调用被重写的方法(即method,动态方式获取),此处为action/productCloth方法),进而调用被代理类重写的方法,实现动态代理
  • 动态方式创建,未知类型——》返回值为Object类型,但又要调用被重写的方法(action/productCloth),所以要强转,而real对应的类(RealSubject)在本例中只实现了subject接口——>强转为Subject

动态代理和AOP编程

  • 前端:struts
  • 后台:与服务端交互(涉及到数据库):Hibernate
  • 中间:spring,负责前端和后台的整合(设计AOP)

  • AOP:面向切面的编程(动态变化)

  • 只知道某位置要调用方法,但不写明是谁,运行时决定
    在这里插入图片描述
    在这里插入图片描述

  • 想要在方法一和二之间添加一个方法,

  • 固定代码之间——》加入一段动态方法(即method方法,如本例中的fly和info方法)


在这里插入图片描述

  • 通过invoke方法来回调,invoke来调用动态方法
  • 把此接口理解为:当代理类调用重写方法(接口定义)转为调用被代理类的重写方法(invoke方法内定义为什么就转化为什么,本例为在方法1和方法2之间插入被代理类的重写方法)
  • 实现InvocationHandler接口类要有被代理类的对象引用和转化的内容

在这里插入图片描述

  • 用于动态创建代理类对象
  • 传入对象——》setObject方法使之成为被代理类对象
  • 静态方法newProxyInstance使得handler和代理类关联起来——》代理类代理被代理类
  • 传入一个对象作为被代理类对象,返回代理类对象

在这里插入图片描述

在这里插入图片描述

总结

  1. 创建实现接口(InvocationHandler)的类,在该类的invoke方法内说明转化的内容(见下文解释)及代理哪个对象
  2. **当代理类调用重写方法(接口定义)转为调用被代理类的重写方法(invoke方法内定义为什么就转化为什么)(**当代理类调用重写方法(接口定义)转为调用被代理类的重写方法(invoke方法内定义为什么就转化为什么
  3. 静态方法newProxyInstance使得实现接口(InvocationHandler)的类的对象和代理类关联起来——》创建代理类来代理被代理类

猜你喜欢

转载自blog.csdn.net/lwz45698752/article/details/85916224
4.4