android-asm字节码插桩与apt原理补充

天津唐秙 天津唐秙     2023-02-20     627

关键词:

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打包流程|android中的字节码操作方式|aop面向切面编程|apt编译时技术

...流程1、Java源码打包流程2、字符串常量池二、Android中的字节码操作方式一、Android中的Java源码打包流程Java程序在Java虚拟机执行前,需要先将Java源码通过javac编译成.class字节码文件,然后才能在虚拟机中运行;1、Java源码打包流程Andro... 查看详情

字节码插桩aop技术(“字节码插桩“技术简介|aspectj插桩工具|asm插桩工具)

文章目录一、"字节码插桩"技术简介二、AspectJ插桩工具三、ASM插桩工具一、"字节码插桩"技术简介性能优化,插件化,热修复,等技术都需要用到"字节码插桩"相关技术;OOP面向对象编程,主要针对业务逻辑进行开发,33... 查看详情

java字节码插桩技术

相关文章:  字节码插桩--你也可以轻松掌握  查看详情

android字节码插桩——详细讲解附带demo(代码片段)

前言什么是字节码插桩字节码插桩就是在构建的过程中,通过修改已经编译完成的字节码文件,也就是class文件,来实现功能的添加从技术上来说,字节码插桩是自定义Gradle插件、ASM、Java字节码、切面编程的综合... 查看详情

字节码插桩之javaagent(代码片段)

字节码插桩之JavaAgent本篇文章将详细讲解有关JavaAgent的知识,揭开它神秘的面纱,帮助开发人员了解它的黑魔法,帮助我们完成更多业务需求WhatisJavaAgentJavaAgent又称为Java探针,它提供了向现有已编译的Java类添加... 查看详情

看这一篇,你也可以自如的掌握字节码插桩(代码片段)

...:8K吃萝卜本文简介使用GradlePlugin、Transform和ASM实现字节码插桩,GradlePlugin相关代码全部由Kotlin编写,所以不熟悉groovy的小伙伴也可以无障碍阅读。什么是字节码插桩要了解字节码插桩,首先要了解AOP(AspectOrientedPr... 查看详情

asm字节码插桩全流程解析(代码片段)

我们需要借助gradle插件来实现ASM字节码插桩。1准备工作但凡涉及到gradle开发,我一般都是会在buildSrc文件夹下进行,还有没有伙伴不太了解buildSrc的,其实buildSrc是Android中默认的插件工程,在gradle编译的时候,... 查看详情

androidgradle中的字节码插桩之asm(代码片段)

目录前言一ASM 1.AOP             2.ASM二ASM中几个重要的类  1.ASM之ClassVisitor 2.ASM之AdviceAdapter5.ASM之ClassReader和ClassWriter三实例1.为所有的方法添加调用日志实例2.AutoLogClassVisitor3.  AutoLogAdviceAdapter4.Transform输出的路径 四总结... 查看详情

androidgradle中的字节码插桩之asm(代码片段)

前言         逐步整理的一系列的总结:     AndroidGradle插件开发初次交手(一)        AndroidGradle的基本概念梳理(二)       Android自定义Gradle插件的完整流程(三)       Android自... 查看详情

最通俗易懂的字节码插桩实战(gradle+asm)(代码片段)

好文推荐:作者:miaowmiaow前言字节码插桩,看起来挺牛皮,实际上是真的很牛皮。但是牛皮不代表难学,只需要一点前置知识就能轻松掌握。GradleTransformGoogle在AndroidGradle的1.5.0版本以后提供了TransfromAPI,... 查看详情

最通俗易懂的字节码插桩实战(gradle+asm)——自动埋点(代码片段)

...者:miaowmiaow链接:https://www.jianshu.com/p/c2132273257a字节码插桩,看起来挺牛皮,实际上是真的很牛皮。但是牛皮不代表难学,只需要一点前置知识就能轻松掌握。GradleTransformGoogle在AndroidGradle的1 查看详情

asm字节码插桩:隐私合规方法检测(代码片段)

1.前言近两年来工信部对于应用的隐私合规安全问题愈加重视,对Android平台的管控程度也要比IOS平台严格很多,很多不合规的应用也先后被下架要求整改。笔者就曾遇到过加班整改隐私合规的问题,隐私合规问题主要... 查看详情

androidaop编程——gradle插件+transformapi+字节码插桩实战(代码片段)

...括Gradle插件的开发、TransformAPI的使用,以及一些操作字节码的工具如AspectJ,Javassist和ASM:AndroidAOP编程(一)——AspectJ基础知识AndroidAOP编程(二&# 查看详情

androidaop编程——gradle插件+transformapi+字节码插桩实战(代码片段)

...括Gradle插件的开发、TransformAPI的使用,以及一些操作字节码的工具如AspectJ,Javassist和ASM:AndroidAOP编程(一)——AspectJ基础知识AndroidAOP编程(二&# 查看详情

androidaop编程——gradle插件+transformapi+字节码插桩实战(代码片段)

...括Gradle插件的开发、TransformAPI的使用,以及一些操作字节码的工具如AspectJ,Javassist和ASM:AndroidAOP编程(一)——AspectJ基础知识AndroidAOP编程(二&# 查看详情

androidgradle中的字节码插桩之asm(代码片段)

... AndroidGradle中的Transform(六)   AndroidGradle之Java字节码(七)      AndroidGradle中的字节码插桩之ASM(八)      AndroidGradle中的使用ASMified插件生成.class的技巧(九)      AndroidGradle中的实... 查看详情

字节码javassist通过字节码插桩监控方法采集运行时入参出参和异常信息(代码片段)

1.概述上一篇文章:【字节码】使用Javassist在运行时重新加载类「替换原方法输出不一样的结果」实时加载类转载来源于:小傅哥的字节码编程-(公众号:bugstack虫洞栈)仅供学习。转载:https://github.com/fuzhengwei/itstac... 查看详情

字节码插桩之javaagent(代码片段)

字节码插桩之JavaAgent本篇文章将详细讲解有关JavaAgent的知识,揭开它神秘的面纱,帮助开发人员了解它的黑魔法,帮助我们完成更多业务需求WhatisJavaAgentJavaAgent又称为Java探针,它提供了向现有已编译的Java类添加... 查看详情