Retrofit - 6 动态代理模式

无侵入 扩展代码。通俗来讲,就是可以做代码增强,让你在不修改原来代码基础上,增强一些方法或功能。

动态代理:代理类在程序运行时创建的代理方式。

相比于静态代理:动态代理很大的优势在于,它能很方便的对我们代理的函数进行统一的处理,而不用去频繁的修改每一个代理类的函数。

两种动态代理的写法:

1 jdk动态代理
需要自己客户端来写辅助接口进行操作的。
由JAVA内部的反射机制来实现的,所以说动态代理反射机制在生成类的过程中比较高效。
public interface Subject {    // 代理类和被代理类都要执行的一个操作。
   void shopping();
}

public class Man implements Subject {  // 被代理类
   @Override
   public void shopping() {
      System.out.println(“Mjj 要去买东西…”);
   }

}

Retrofit - 6 动态代理模式

以上这个类是 代理类。

public interface InvocationHandler {
   Object invoke(Object var1, Method var2, Object[] var3) throws Throwable;
}

动态代理都必须要实现的这个接口,可以把这个InvocationHandler理解成代理对象,调用程序的时候,所一定要实现的这个接口。

invoke(Object proxy, Method method, Object[] args)
第一个参数:所代理的真实对象,可以理解成我们真实对象的一个代理。
第二个参数:我们调用真实对象的某个方法,它的一个Method对象。

第三个参数:我们所代理真实对象的某个方法的所有参数。

InvocationHandler
1) 每个代理类的对象都会关联一个表示内部处理逻辑的InvocationHandler接口的实现。
2) invoke方法的参数中可以获取参数。

3) invoke方法的返回值被返回给使用者。

Retrofit - 6 动态代理模式

Retrofit - 6 动态代理模式

Retrofit - 6 动态代理模式

2 CGLIB  可以直接修改字节码。

【总结】
运行期:
动态代理是通过我们代理类与相关机构不直接发生联系的情况下,而在运行时实现我们的动态关联。
invocationHandler接口和Proxy类:
动态代理与静态代理最大的不同:动态代理的代理类是不需要我们手动生成的,而该代理类是在我们运行时动态生成的。