安卓Gradle插件开发-ASM字节码修改-AutoRegist
上两节课我们完成了jar包和目录的class文件目录,我们也定义了一些接口和类,我们先把上次有一个问题解决一下
image.png
这里扫描jar包扫描到META-INF就break 这里我觉的有点问题
因为可能我们先扫描到的不一定是class而是META-INF那后面的class就没有机会扫描出来了,每个jar包都包含META-INF所以我觉的换成continue比较合适 我们改一下
image.png虽然扫描结果一样 但是这里的概念是不一样的 我们其实都可以打开jar包看一下
忘了jar包在哪里了 不过我们知道为啥就行
我们进行这节课的内容 我们扫描完class之后就需要我们插入
但是我们思考一下 如果需要完成插入 是不是应该在所有扫描完成之后 找到需要插入的类 和需要被插入的类
比如 要被插入的类 为CategoryManager 它对应在哪个jar包还是class文件,这些基本信息都要记录起来 方便我么插入的时候可以拿来就用
需要插入的类是哪些呢比如CategoryA 就是ICategory的接口实现类 ,我们同样要知道他是在哪个文件里面,也是需要记录下来,我们先做一个简单的记录 ,后面会配合插件自定义属性配置到一个配置文件里面
我们看看怎么做
image.png image.png我们可以发现这个其实就class文件放置的根目录 我们只要去掉这个根目录就可以拿到class文件的类的全路径名字对吧
image.png大家可以看到对于class文件来说这个path就是全路径名称 ,对于目录来说就是目录名称
所以我们这里有一个isFile的判断 image.png这样保证我们拿出来的都是class文件对吧
image.png
这个流程基本解释一下
首先 我们通过ClassReader把整个class文件读取到内存,然后声明了一个ClassWriter用于代码写入,
然后自定义了一个ScanClassVisitor类访问器来访问类里面的所有元素,包括属性和方法
主要来看看这个ScanClassVisitor访问类的操作
image.png能看到基本信息 这节课先这样 下午有空继续