ASM基础教程-方法

简介: 本文解释如何用核心 ASM API 生成和转换已编译的方法。首先介绍编译后的方法,然后介绍用于生成和转换它们的相应 ASM 接口、组件和工具,并给出大量说明性示例。

1 结构

在编译类的内部,方法的代码存储为一系列的字节码指令。

要生成和转换类,最根本的就是要了解这些指令,并理解它们是如何工作的。

本节将对这些指令进行全面概述,这些内容足以开始编写简单的类生成器与转换器代码。如需完整定义,应当阅读 Java 虚拟机规范。

1.1 执行模型

先来介绍 Java 虚拟机执行模型。

我们知道,Java 代码是在线程内部执行的。每个线程都有自己的执行栈,栈由帧组成。每个帧表示一个方法调用:

  • 每次调用一个方法时,会将一个新帧压入当前线程的执行栈
  • 当方法返回时,或者是正常返回,或者是因为异常返回,会将这个帧从执行栈中弹出,
  • 执行过程在发出调用的方法中继续进行(这个方法的帧现在位于栈的顶端)。


每一帧包括两部分:

  • 一个局部变量部分
  • 一个操作数栈部分


局部变量部分包含可根据索引

以随机顺序访问的变量。由名字可以看出,操作数栈部分是一个栈,其中包含了供字节代码指令

用作操作数的值。这意味着这个栈中的值只能按照“后入先出”顺序访问。不要将操作数栈和线

程的执行栈相混淆:执行栈中的每一帧都包含自己的操作数栈。

局部变量部分与操作数栈部分的大小取决于方法的代码。这一大小是在编译时计算的,并随

字节代码指令一起存储在已编译类中。因此,对于对应于某一给定方法调用的所有帧,其局部变

量与操作数栈部分的大小相同,但对应于不同方法的帧,这一大小可能不同。


一些基本示例,具体体会一下字节代码指令是如何工作的。考虑下面的 bean 类:

package pkg; 
public class Bean { 
 private int f; 
 public int getF() { 
 return this.f; 
 } 
 public void setF(int f) { 
 this.f = f; 
 } 
} 

getter 方法的字节代码为:

ALOAD 0

GETFIELD pk如果 mv 是一个 Met

hodVisitor,则 3.1.3 节定义的 getF 方法的字节代码可以用以下方

法调用生成:

mv.visitCode(); 
mv.visitVarInsn(ALOAD, 0); 
mv.visitFieldInsn(GETFIELD, "pkg/Bean", "f", "I"); 
mv.visitInsn(IRETURN); 
mv.visitMaxs(1, 1); 
mv.visitEnd();
目录
相关文章
|
5月前
|
Java API Android开发
ASM 框架:字节码操作的常见用法(生成类,修改类,方法插桩,方法注入)
ASM 框架:字节码操作的常见用法(生成类,修改类,方法插桩,方法注入)
96 0
|
监控 NoSQL Java
ASM字节码编程 | 用字节码增强技术给所有方法加上TryCatch捕获异常并输出!
最简单粗暴的可能就是硬编码在方法中,收取执行耗时以及出入参和异常信息。但这样的成本实在太大,而且有一些不可预估的风险。 可以选择切面方式做一套统一监控的组件,相对来说还是好一些的。但也需要硬编码,同时维护成本不低。 市面上对于这样的监控其实是有整套的非入侵监控方案的,比如;Google Dapper、Zipkin等都可以实现,他们都是基于探针技术非入侵的采用字节码增强的方式进行监控。
436 0
ASM字节码编程 | 用字节码增强技术给所有方法加上TryCatch捕获异常并输出!
|
存储 监控 架构师
ASM字节码编程 | JavaAgent+ASM字节码插桩采集方法名称以及入参和出参结果并记录方法耗时
研发代码涉及流程链路展示、每个链路测试次数、通过次数、失败次数、当时的出入参信息以及对应的代码块在当前提测分支修改记录等各项信息。最终测试在执行验证时候,分配验证渠道扫描到所有分支节点,可以清晰的看到全链路的影响。那么,这样的测试才是可以保证系统的整体质量的。
553 0
ASM字节码编程 | JavaAgent+ASM字节码插桩采集方法名称以及入参和出参结果并记录方法耗时
|
SQL Oracle 关系型数据库
【ASM】ASM数据文件和OS文件(FILESYSTEM)转移方法总结
【ASM】ASM数据文件和OS文件(FILESYSTEM)转移方法总结 blog文档结构图:   1  说明 本blog介绍了各种asm数据文件和filesystem文件之间的转换方法,有的记录了过程,有的没有记录过程只记录了相关代码,大家若有兴趣可以自行测试。
871 0
|
关系型数据库 Oracle
【ASM学习】从ASM拷贝文件的方法
ASM 中的所有文件由oracle 系统来管理,想要从asm中拷贝到文件系统中可以使用如下方法: create or replace directory SOURCE_DIR as '+USER_DATA/ORCL/DATAFILE/';create or r...
881 0
|
6月前
|
Oracle 关系型数据库
oracle asm 磁盘显示offline
oracle asm 磁盘显示offline
326 2
|
27天前
|
存储 Oracle 关系型数据库
数据库数据恢复—Oracle ASM磁盘组故障数据恢复案例
Oracle数据库数据恢复环境&故障: Oracle ASM磁盘组由4块磁盘组成。Oracle ASM磁盘组掉线 ,ASM实例不能mount。 Oracle数据库故障分析&恢复方案: 数据库数据恢复工程师对组成ASM磁盘组的磁盘进行分析。对ASM元数据进行分析发现ASM存储元数据损坏,导致磁盘组无法挂载。