设计模式之代理模式

设计模式之代理模式

10分钟看懂动态代理设计模式(升级篇)-对这篇动态代理模式的思路整理

仿JDK实现动态代理逻辑

通过一步步实现一个简易的仿JDK实现动态代理逻辑

第1步:通过动态代理方式模拟实现静态代理效果
  1. 通过JavaPoet生成静态代理类TimeProxy源代码
  2. 通过JDK编译TimeProxy源代码
  3. 通过类加载器把TimeProxy字节码文件转换为内存中TimeProxy字节码对象
  4. 通过反射机制把创建代理对象

通过第1步实现了:

  • 不再需要手动创建TimeProxy类java代码(站在迈向一个完整的动态代理的角度)
  • 可以代理任意实现了Flyable接口的类对象,并获取接口方法的执行时间

产生的问题:

  • 只是针对实现了Flyable接口的类对象,并不是任意对象
第2步:接口类型作为参数传入,而不是写死

通过第2步实现了:

  • 可以针对实现传入接口的任意对象

产生的问题:

  • 只能代理特定的功能,缺少灵活性,在这里是只能用于获取方法的执行时间
  • 如果要增加其它代理功能,例如在委托方法执行前后打印日志则需要重新创建一个代理类,显然这是不妥的
第3步:新增InvocationHandler接口,用于处理自定义逻辑

开发者需要对代理类进行自定义处理时,只要实现该接口,并在invoke方法中进行相应的处理即可

第4步:修改生成代理对象代码

为此,我们需要在原Proxy.newProxyInstance()方法中做如下改动:

  • 在newProxyInstance方法中传入InvocationHandler
  • 在生成的代理类中增加成员变量handler
  • 在生成的代理类方法中,调用invoke方法

总结

  • Proxy->newProxyInstance用于生成代理对象
  • InvocationHandler:这个接口主要用于自定义代理逻辑处理
  • 为了完成对被代理对象的方法拦截,我们需要在InvocationHandler对象中传入被代理对象实例。

你可能感兴趣的:(设计模式之代理模式)