// 因为Activity 或者 Fragment 是可以传递参数的,getIntent()、getArguments(),就收集该类中被 Autowired 注解的字段
// Activity or Fragment
if (types.isSubtype(tm, type_Activity) || types.isSubtype(tm, fragmentTm) || types.isSubtype(tm, fragmentTmV4)) {
// 当前的类是 Activity 或 Fragment
// Get all fields annotation by @Autowired
// paramsType 与 injectConfig 用来生成文档的,不用关心
Map<String, Integer> paramsType = new HashMap<>();
Map<String, Autowired> injectConfig = new HashMap<>();
//收集类中的被Autowired注解的字段,但字段不能是IProvider类型
injectParamCollector(element, paramsType, injectConfig);
if (types.isSubtype(tm, type_Activity)) {
// Activity
routeMeta = new RouteMeta(route, element, RouteType.ACTIVITY, paramsType);
} else {
// Fragment
routeMeta = new RouteMeta(route, element, RouteType.parse(FRAGMENT), paramsType);
}
routeMeta.setInjectConfig(injectConfig);
} else if (types.isSubtype(tm, iProvider)) { // IProvider
routeMeta = new RouteMeta(route, element, RouteType.PROVIDER, null);
} else if (types.isSubtype(tm, type_Service)) { // Service
routeMeta = new RouteMeta(route, element, RouteType.parse(SERVICE), null);
} else {
throw new RuntimeException(“The @Route is marked on unsupported class, look at [” + tm.toString() + “].”);
}
// 收集具有相同的group的RouteMeta到 Map<String, Set>
categories(routeMeta);
}
// 生成 loadInto 方法
// public void loadInto(Map<Integer, Class<? extends IInterceptor>> interceptors)
MethodSpec.Builder loadIntoMethodOfProviderBuilder = MethodSpec.methodBuilder(METHOD_LOAD_INTO)
.addAnnotation(Override.class)
.addModifiers(PUBLIC)
.addParameter(providerParam
Spec);
// Start generate java source, structure is divided into upper and lower levels, used for demand initialization.
for (Map.Entry<String, Set> entry : groupMap.entrySet()) {
String groupName = entry.getKey();
//public void loadInto(Map<String, RouteMeta> atlas)
MethodSpec.Builder loadIntoMethodOfGroupBuilder = MethodSpec.methodBuilder(METHOD_LOAD_INTO)
.addAnnotation(Override.class)
.addModifiers(PUBLIC)
.addParameter(groupParamSpec);
// Build group method body
Set groupData = entry.getValue();
for (RouteMeta routeMeta : groupData) {
// 这个ClassName就是被Route注解的类名
ClassName className = ClassName.get((TypeElement) routeMeta.getRawType());
//这是给 IProvider 的类型做了一次特殊服务
switch (routeMeta.getType()) {
case PROVIDER: // Need cache provider’s super class
// 注意 routeMeta 返回的是RouteType类型,比如 PROVIDER类型,就是说element是 IProvider 的子类。
// 获取这个TypeElement的直接父接口
// 比如我们一般定义XXXServiceImpl, XXXService ,然后XXXService接口继承自IProvider
List<? extends TypeMirror> interfaces = ((TypeElement) routeMeta.getRawType()).getInterfaces();
// 遍历这个父接口
for (TypeMirror tm : interfaces) {
if (types.isSameType(tm, iProvider)) { // Its implements iProvider interface himself.
// This interface extend the IProvider, so it can be used for mark provider
// 该element是 IProvider的直接子类
// 就会生成类似 providers.put(“com.alibaba.android.arouter.demo.module1.testservice.SingleService”,
// RouteMeta.build(RouteType.PROVIDER, SingleService.class, “/yourservicegroupname/single”, // “yourservicegroupname”, null, -1, -2147483648));
loadIntoMethodOfProviderBuilder.addStatement(
“providers.put($S,