Android-ASM字节码插桩与APT原理补充

Posted 天津 唐秙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android-ASM字节码插桩与APT原理补充相关的知识,希望对你有一定的参考价值。

ASM字节码插桩与APT原理补充

技术点

APT补充
1.策略模式
2.SPI机制分析
3.通过javac源码分析APT执行原理
ASM
1.逆波兰表达式
2.java文件转换class文件基本规则
3.ASM框架完成字节码插桩

APT

在java文件编译成class文件的过程中,apt可以监视在这个过程中的注解,因此我们可以利用这个APT生成文件或者修改文件,apt是注解处理工具。
生成的方法就是自己写一个类,这个类去继承AbstractProcessor

策略模式

策略模式是针对一个方法的执行方案进行处理的,对于同一个方法,我们可以有不同的处理方式,在使用的时候new出来的是谁,使用的时候,执行的就是谁。
可以通过 策略模式+注解+反射 实现一种叫做SPI机制的东西。

SPI机制

SPI,全称Service Provider Interface
是一种服务发现机制,它通过ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所在的类。

JavaC源码分析SPI机制

注解处理器的很多东西都是依靠Round这个辅助工具

返回值的作用?
注解是否往下传递,如果是true,就不往下传递了,所以一般是false

逆波兰表达式

表达式中一般由操作数,运算符组成,例如算术表达式中,通常把运算符放在两个操作数的中间,这称为中缀表达式,如A+B。
波兰数学家Jan Lukasiewicz提出了另一种数学表达式,它有两种表示形式:
把运算符写在操作数前面,称之为波兰表达式或者前缀表达式,如+AB,把运算符写在操作数后面,称之为逆波兰表达式,或者后缀表达式,如AB+,其中逆波兰表达式在编译技术中有着普遍应用。

将中缀表达式转换为后缀表达式算法:
1.从左至右扫描中缀表达式
2.若读取的是操作数,则判断该操作数的类型,并将该操作数存入操作数堆栈
3.若读取的是运算符
(1)该运算符为左括号,则直接存入运算符堆栈
(2)该运算符为右括号,则输出运算符堆栈当中的运算符到操作数堆栈中,直到遇到左括号为止
(3)该运算符为非括号运算符
(a)运算符堆栈栈顶的运算符为括号,则直接存入运算符堆栈
(b)若比运算符堆栈栈顶的运算符优先级
(c)若比运算符堆栈栈顶的运算符优先级低,则输出栈顶运算符到操作数堆栈,并将当前运算符压入运算符堆栈
4.当表达式读取完成后运算符堆栈中尚有运算符时,则依序取出运算符到操作数堆栈,直到运算符堆栈为空。

以上是关于Android-ASM字节码插桩与APT原理补充的主要内容,如果未能解决你的问题,请参考以下文章

字节码插桩Android 打包流程 | Android 中的字节码操作方式 | AOP 面向切面编程 | APT 编译时技术

字节码插桩AOP 技术 ( “字节码插桩“ 技术简介 | AspectJ 插桩工具 | ASM 插桩工具 )

Android字节码插桩——详细讲解 附带Demo

Java 字节码插桩技术

看这一篇,你也可以自如的掌握字节码插桩

看这一篇,你也可以自如的掌握字节码插桩