字节码插桩:从分析class文件结构开始

Java的class字节码使得代码能在任何支持JVM的平台上运行。class文件由无符号数和表组成,包含方法描述符如基本类型、引用类型等。OpCode操作码用于JVM执行指令,例如new、invokevirtual等。文章还提到了AndroidFramework的相关知识点,如Handler、Binder、AMS等的核心概念。

作者:小马快跑

Class字节码

Java 能做到 一次编译,到处运行,主要就是靠 class字节码 文件,也就是 java 文件经过编译之后 .java -> .class,然后再被 JVM 虚拟机加载。其实,不仅是 java 语言,只要是符合规则的 class 字节码文件,都可以被 JVM 加载,如 Grooy、Kolin 语言:

有了 class 字节码,也就解除了 VM虚拟机编程语言之间的耦合性。不管什么语言,只要是能编译成符合规则的字节码文件,就可以被 VM虚拟机 识别并加载到内存中

class字节码构成

class字节码 中由无符号数两种数据结构组成。如:

  • 无符号数:基本数据类型,u1、u2、u4、u8分别表示1、2、4、8个字节的无符号数,无符号数可以用来表示数字、索引引用、数量只或者字符串(UTF-8编码)。
  • 表:由多个无符号数或者其他表作为数据项构成的复合数据类型,class文件中所有的表都以“_info”结尾。所以,整个 Class 文件可以认为就是一张表。

示例:

package org.ninetripods.lib_bytecode.asm.coreApi;

public class Test {
    private int num = 0;

    public void addNum() {
        num++;
        System.out.println("num:" + num);
    }

    public static int staticAdd(int a, int b) {
        return a + b;
    }
}

经过javac 编译之后,会生成Test.class字节码文件,用010 Editor打开这个文件:

上述的字节码看上去有点乱,但其实是按顺序排列的,整理信息如下:

如我们常见的字节码文件都是以CAFEBABE开头,表示VM虚拟机要加载的是class字节码;紧跟着的0000表示的主副版本,再往后面的0037,用十进制表示为55,对应JDK 11等等。

继续使用 javap -c xxx.class命令可以 输出分解后的 java字节码

上述文件中描述了Test.class加载到内存时的执行顺序,包括各种描述符及操作码,接下面就来看一看它们。

类型描述符

基本类型描述符

每个基本类型都对应一个字母,如下:

<
基本类型 描述符
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值