Retrofit 中的动态代理机制是其核心特性之一。
在 Retrofit 中,动态代理主要通过 Java 的
Proxy 类来实现(jdk的动态代理)。当使用
Retrofit.create() 方法创建接口实例时,实际上是利用动态代理来生成一个实现了指定接口的代理对象。
动态代理的原理在于,通过
ClassLoader 和接口列表生成一个继承
Proxy 并实现了接口列表的代理类,然后通过反射创建一个代理类的实例。
例如,在创建代理对象时,
Proxy.newProxyInstance 方法会被调用。它接受类加载器、接口数组和一个
InvocationHandler 作为参数。这个
InvocationHandler 负责处理代理对象方法的调用。
在 Retrofit 中,当调用接口中的方法时,会触发代理对象的
invoke 方法。在
invoke 方法中,Retrofit 会根据方法的注解和参数等信息,生成网络请求的
request ,然后通过底层的网络框架(通常是
OkHttp )去发起网络请求,并将返回的
response 通过转换器转换成相应的数据模型。
例如,定义一个接口
public interface GitHubService { @GET("/notifications") Call getNotici(); } ,
然后通过
Retrofit retrofit = new Retrofit.Builder().baseUrl("api.github.com/").build();
GitHubService service = retrofit.create(GitHubService.class); 来创建接口的实例。
总之,Retrofit 的动态代理机制实现了将网络请求的定义和调用以一种简洁、灵活的方式进行封装,提高了代码的可读性和可维护性。