随笔 - 632  文章 - 17  评论 - 54  阅读 - 93万

Android使用动态代理模仿Retrofit的create方法,使其可以返回任意的接口类型

一、概述

  本节将模仿一下Retrofit的create泛型方法,根据传入的interface,生成一个代理对象。同个这个小例子可以加深对retrofit的理解

二、实际代码

  定义一个book接口,通过动态带来创建其实现类,并调用其实现类的book方法

  1.Book.java:普通的接口

  2.ApiBookInterface.java:定义一个普通的接口

  3.MyRetrofit.java:create方法生成代理对象

  4.JavaBook.java 实现了Book.java接口的类

  5.测试方法

  a.Book.java

1
2
3
4
5
6
7
8
9
10
package com.yw.rxjava3demo.proxy;
 
/**
 * 所有书本的基类
 * create by yangwei
 * on 2020-02-26 12:16
 */
public interface Book {
    void read();
}

  b.JavaBook.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.yw.rxjava3demo.proxy;
 
import com.yw.rxjava3demo.MyLog;
 
/**
 * create by yangwei
 * on 2020-02-26 12:17
 */
public class JavaBook implements Book{
    @Override
    public void read() {
        MyLog.log("《深入Java虚拟机》");
 
    }
}

  c.ApiBookInterface.java

1
2
3
4
5
6
7
8
9
package com.yw.rxjava3demo.proxy;
 
/**
 * create by yangwei
 * on 2020-02-26 12:24
 */
public interface ApiBookInterface {
    Book getBook();
}

  d.MyRetrofit.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.yw.rxjava3demo.proxy;
 
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
 
/**
 * create by yangwei
 * on 2020-02-26 12:18
 */
public class MyRetrofit {
    private ProxyBookAdapterFactory proxyBookAdapterFactory;
 
    public MyRetrofit(ProxyBookAdapterFactory proxyBookAdapterFactory) {
        this.proxyBookAdapterFactory = proxyBookAdapterFactory;
    }
 
    public <T> T create(final Class<T> bookClass) {
        return (T) Proxy.newProxyInstance(bookClass.getClassLoader(), new Class<?>[]{bookClass}, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //不走代理方法,直接走原始方法
                if (method.getDeclaringClass() == Object.class) {
                    return method.invoke(this, args);
                }
                return new AndroidBook();
            }
        });
    }
 
 
 
    public static final class Builder {
        private ProxyBookAdapterFactory proxyBookAdapterFactory;
 
        public Builder setProxyBookAdapterFactory(ProxyBookAdapterFactory proxyBookAdapterFactory) {
            this.proxyBookAdapterFactory = proxyBookAdapterFactory;
            return this;
        }
 
        public MyRetrofit build() {
            return new MyRetrofit(proxyBookAdapterFactory);
        }
    }
}

  e.测试方法

1
2
3
ApiBookInterface apiBookInterface  = new com.yw.rxjava3demo.proxy.MyRetrofit.Builder().build().create(ApiBookInterface.class);
       com.yw.rxjava3demo.proxy.Book book = apiBookInterface.getBook();
       book.read();

  f.测试结果,会输出《深入java虚拟机》

1
2020-02-26 13:29:02.953 1604-1604/? E/MyLog: 《深入Java虚拟机》

  总结:希望通过这个小例子大家能够对Proxy有更深的理解,同时也对Retrofit的create方法加深印象。

posted on   飘杨......  阅读(1043)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示