除了DomModule以外,其他的dom都是通过反射调用 JSMethod 注解的方法,而DomModule采用直接方法调用
WxModalUIModule的注册为主线说明整个module的注册流程
registerModule(“modal”, WXModalUIModule.class)
WXSDKEngine#registerModule(String moduleName, Class<? extends WXModule> moduleClass)
WXSDKEngine#registerModule(String moduleName, Class
moduleClass,boolean global) 根据Class创建
TypeModuleFactory
继承于ModuleFactory
,JavascriptInvokable
ModuleFactory
作用主要是创建WxModule
子类实例@Override
public T buildInstance() throws IllegalAccessException, InstantiationException {
return mClazz.newInstance();
}
JavascriptInvokable
主要是获取WxModule
子类中JSMethod
标注的方法名以及对应是的反射帮助类MethodInvoker
,关键的接口是getMethods
和getMethodInvoker
- ```java
@Override
public String[] getMethods() {
if (mMethodMap == null) {
generateMethodMap();
}
Set
keys = mMethodMap.keySet(); return keys.toArray(new String[keys.size()]); }
- ```java
@Override
public String[] getMethods() {
if (mMethodMap == null) {
generateMethodMap();
}
Set
@Override public Invoker getMethodInvoker(String name) { if (mMethodMap == null) { generateMethodMap(); } return mMethodMap.get(name); } ```
WXSDKEngine#registerModule(String moduleName, ModuleFactory factory, boolean global)
- 目前看来注册module的方式,变量global始终是false 所有不会存在全局module的使用
WxModuleManager#registerModule
三个关键map的说明
- ```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<>(); ```