ASM学习——开端

什么是ASM

ASM是一个操作java字节码的类库。
ASM的操作对象:字节码(bytecode)数据。一个java文件经过java编译器javac编译之后会生成.class文件,在.class文件中,存储的就是字节码数据,ASM的操作对象就是字节码,在很多情况下,字节码的具体表现形式就是class文件。
ASM是如何操作字节码数据的:ASM操作字节码的方式是先将字节码进行拆分,加入为达到某种目的实现的修改之后再进行合并。

ASM可以执行的操作:

  1. analysis:可以针对已有的class进行语法和语义分析,可以协助找到工程的bug,检测没有使用的代码,以及反编译工程代码
  2. generation:从无到有创建新的class文件
  3. transformation:针对已有的class进行变换,转换成新的class,其中包括优化程序,也可以针对程序进行混淆,或者添加性能检测的代码(AOP)。

典型应用:
4. Spring中的AOP,AOP可以通过JDK的动态代理进行实现,也可以依赖于CGlib进行实现,CGlib是在ASM的基础上构建起来的。
5. JDK中的lambda表达式是在JAVA8中引入的重要特性,允许将方法作为参数进行传递,使得代码更加简洁,而lambda表达式的调用是通过ASM实现的。所以JDK中是自带ASM的。

ASM分为两个部分,包含core API以及Tree API,Core API中包含三个部分,asm.jar,asm-utils.jar,以及asm-common.jar。

asmjar包中主要是使用到的是10个类,其中最主要的是classreader,classvisitor以及classwriter。他们之间的关系如下:
在这里插入图片描述
其中visit()修改的是类和父类的信息,visitField修改的是变量,visitMethod修改的是方法。

asm-utils中包含的是具体的类文件,主要分为check开头的类以及Trace开头的类,以check开头的类用于检查生成的class文件是否正确,Trace开头的类用于将class的内容打印输出,根据输出的文字信息可以探索或者trace(跟踪)class文件的内部信息。

ASM与classfile

在这里插入图片描述
在这里插入图片描述
在学习了解ASM的时候需要了解classfile的内容,需要了解在class文件中各项数据的含义,比如method_info以及Code_attribute。classfile内容又与堆栈调用存在联系,在崩溃堆栈分析中需要解析寄存器的内容与含义,在classfile中同样是根据这部分内容进行的分析。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值