Retrofit原理(一):动态代理介绍

本文探讨了Retrofit如何利用Java动态代理实现网络请求接口。通过分析Retrofit的使用流程,发现Call接口的实现涉及Proxy类。深入源码,揭示了Proxy在创建代理类时的角色,强调动态代理仅支持接口,若需代理类,则需借助如cglib等第三方库。
摘要由CSDN通过智能技术生成

最近用到Retrofit,发现只需要定义一个接口就能完成相应功能,这是怎么做到的?
这是用到了java的动态代理机制,Proxy类
还是先来看下使用的流程吧,和okhttp一样分为异步和同步,其实Retrofit是对网络请求接口的封装,具体的网络请求是通过底层的Okhttp来实现的,所以后面的流程是一样的
先定义一个接口

public interface IRetrofitTest {
   

    @GET
    Call<String> get(@Url String url);
}
		Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://www.baidu.com/")
                .addConverterFactory(ScalarsConverterFactory.create())
                .build();

        IRetrofitTest iRetrofitTest = retrofit.create(IRetrofitTest.class);

        Call<String> call = iRetrofitTest.get("http://www.baidu.com");
        call.enqueue(new Callback<String>() {
   
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
   
                Log.d("Response", response.body());
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
   

            }
        });

以上便完成了异步网络请求。
可以看到,Call call = iRetrofitTest.get(“http://www.baidu.com”);
Call接口是怎么被实现的?带着这些疑问,来看看源码

public <T> T create(final Class<T> service) {
   
    Utils.validateServiceInterface(service);
    if (validateEagerly) {
   
      eagerlyValidateMethods(service);
    }
    //Proxy是java实现动态代理的类
    return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] {
    service },
        new InvocationHandler() {
   
          private final Platform platform = Platform.get();
          private final Object[] emptyArgs = new Object[0];

          @Override public @Nullable Object invoke(Object proxy, Method method,
              @Nullable Object[] args) throws Throwable {
   
            // If the method is a method from Object then defer to normal invocation.
            //如果是Object类,直接调用里面的方法
            if (method.getDeclaringClass() == Object.class) {
   
              return method.invoke(this, args);
            }
            //如果是default方法,则直接调用改默认方法
            if (platform.isDefaultMethod(method)) {
   
              return platform.invokeDefaultMethod
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值