除了DomModule以外,其他的dom都是通过反射调用 JSMethod 注解的方法,而DomModule采用直接方法调用

    WxModalUIModule的注册为主线说明整个module的注册流程

    1. registerModule(“modal”, WXModalUIModule.class)

    2. WXSDKEngine#registerModule(String moduleName, Class<? extends WXModule> moduleClass)

    3. WXSDKEngine#registerModule(String moduleName, Class moduleClass,boolean global)

      1. 根据Class创建 TypeModuleFactory 继承于ModuleFactoryJavascriptInvokable

      2. ModuleFactory作用主要是创建WxModule子类实例

          1. @Override
          2. public T buildInstance() throws IllegalAccessException, InstantiationException {
          3. return mClazz.newInstance();
          4. }
      3. JavascriptInvokable主要是获取WxModule子类中 JSMethod 标注的方法名以及对应是的反射帮助类MethodInvoker ,关键的接口是 getMethodsgetMethodInvoker

        1. ```java @Override public String[] getMethods() { if (mMethodMap == null) { generateMethodMap(); } Set keys = mMethodMap.keySet(); return keys.toArray(new String[keys.size()]); }

      @Override public Invoker getMethodInvoker(String name) { if (mMethodMap == null) { generateMethodMap(); } return mMethodMap.get(name); } ```

    4. WXSDKEngine#registerModule(String moduleName, ModuleFactory factory, boolean global)

      1. 目前看来注册module的方式,变量global始终是false 所有不会存在全局module的使用
    5. WxModuleManager#registerModule

      1. 三个关键map的说明

        1. ```java /**
        • 以Module name为key,{@link ModuleFactoryImpl} 为value的map,{@link ModuleFactoryImpl} 只是 {@link ModuleFactory}的
        • 包装类,没看出为什么如此设计,实际在注册中的具体实现类是{@link com.taobao.weex.common.TypeModuleFactory} / private static volatile ConcurrentMap sModuleFactoryMap = new ConcurrentHashMap<>(); /*
        • 由于注册module的时候采用的是{@link com.taobao.weex.WXSDKEngine#registerComponent(String, Class)} 模式,导致 {@params global}
        • 始终是false,因此 {@link #sGlobalModuleMap} 在 {#l 107}始终不会存储,因此无实际意义 / private static Map sGlobalModuleMap = new HashMap<>(); /*
        • 此map是否为了防止初始化注册的module失败的情况下 在js调用本地方法 {@link WXBridgeManager#callNativeModule(String, String, String, JSONArray, Object)}
        • 时未null的情况下重新创建一份
        • if (WXDomModule.WXDOM.equals(module)) {//是dom 模块
        • WXDomModule dom = WXModuleManager.getDomModule(instanceId);
        • if(dom != null){
        • return dom.callDomMethod(method, arguments);
        • } else {//dom 模块没注册成功时,在此重新创建
        • createDomModule(WXSDKManager.getInstance().getSDKInstance(instanceId));
        • }
        • } else {//非dom模块
        • return callModuleMethod(instanceId, module,
        • method, arguments, options);
        • } */ private static Map sDomModuleMap = new HashMap<>(); ```