筛选要插入ASM代码的类CategoryManager
- 我们最终实现的效果
public class CategoryManager {
static
{
CategoryManager.register(new CategoryA()); //scanInterface的实现类
CategoryManager.register(new CategoryB()); //scanSuperClasses的子类
}
}
- 需要筛选的类为 CategoryManager
筛选Jar文件
- 剔除系统Class类
if(entryName.startsWith("android/")||
entryName.startsWith("androidx/")||
entryName.startsWith("META-INF")){
continue
}
-
需要插入代码的类
image.png - 定义变量needInsertClassNameLeft(需要插入代码的类),以及代码查找逻辑
String needInsertClassNameLeft="com/billy/app_lib_interface/CategoryManager"
boolean shouldProcessClass(String entryName) {
// println('classes:' + entryName)
if (entryName == null || !entryName.endsWith(".class"))
return false
else
return true
}
if(shouldProcessClass(entryName)){
String needEntryName=entryName.substring(0,entryName.lastIndexOf("."))
if(needEntryName.endsWith(needInsertClassNameLeft)){
needInsertFile=dest
project.logger.error('needInsertClass:'+needInsertFile.absolutePath)
}else {
// asmScanClass(jarFile.getInputStream(jarEntry),src.absolutePath)
}
}
-
找到需要插入的Class类所在Jar文件
image.png
这节课先到这里,下节目我们讲查被插入类接口实现对象 scanInterface,再见

