1. 定义Java接口
    2. 加载实现类

    通过RouterService注解声明实现类所实现的接口(或继承的父类,例如Activity、Fragment、Object等,后文不再重复说明),一个接口可以有多个实现类,一个类也可以同时实现多个接口。RouterService注解的参数如下:

    • interfaces:必选参数。声明实现的接口,可配置多个。
    • key:可选参数。同一接口的不同实现类,通过唯一的key进行区分。
    • singleton:可选参数。声明实现类是否为单例,默认为false。

    示例如下:

    可以直接获取实现类的Class,例如获取Activity的Class进行页面跳转。

    2.1 指定接口和Key,获取某个实现类的Class(要求注解声明时指定了Key)

    2.2 指定接口,获取注解声明的所有实现类的Class

    1. List<Class<IService>> classes = Router.getAllServiceClasses(IService.class);

    3.1 无参数构造

    3.2 Context参数构造

    1. // 使用Context参数构造
    2. IService service = Router.getService(IService.class, context);
    3. List<IService> list = Router.getAllServices(IService.class, context);

    3.3 自定义Factory通过反射构造

    对于实现类有特殊构造函数的情况,可以通过Factory自行从class获取构造方法进行构造,示例如下:

    1. // 使用自定义Factory
    2. IFactory factory = new IFactory() {
    3. public Object create(Class clazz) {
    4. }
    5. };
    6. IService service = Router.getService(IService.class, factory);
    7. List<IService> list = Router.getAllServices(IService.class, factory);

    3.4 使用Provider提供实例

    在声明实现类时,可以在类中定义一个返回值类型为该实现类且无参数的静态方法,并使用RouterProvider注解标注。当调用Router获取实例时,如果没有指定Factory,则优先调用Provider方法获取实例,找不到Provider再使用无参数构造。使用示例如下:

    3.5 singleton参数说明

    注解声明为singleton的单例实现类,在调用getService()/getAllServices()方式获取实例时,实例会由单例缓存池管理,WMRouter中不会重复构造,且线程安全。

    利用ServiceLoader可以实现方法调用。

    WMRouter的method包中提供了通用的Function接口Func0 ~ Func9、FuncN,分别表示参数为0~9或可变参数的方法。声明方法时应该实现Function接口,示例如下。对于调用次数较多的方法,建议声明为singleton,避免每次调用时重复创建。

    1. @RouterService(interfaces = Func2.class, key = "/add", singleton = true)
    2. public class AddMethod implements Func2<Integer, Integer, Integer> {
    3. public Integer call(Integer a, Integer b) {
    4. return a + b;
    5. }
    6. }

    方法的调用示例如下:

    1. Func2<Integer, Integer, Integer> addMethod = Router.getService(Func2.class, "/add");