美文网首页
14. 三个字节码分析

14. 三个字节码分析

作者: ZFH__ZJ | 来源:发表于2020-02-20 13:06 被阅读0次

    第一个字节码分析

    package com.zj.study.jvm.bytecode;
    
    /*
        javap是jdk自带的反解析工具。它的作用就是根据class字节码文件,反解析出当前类对应的code区(汇编指令)、本地变量表、异常表和代码行偏移量映射表、常量池等等信息。
        -v -verbose,输出附加信息(包括行号、本地变量表,反汇编等详细信息)
        -c,对代码进行反汇编
        javap com.zj.study.jvm.bytecode.MyTest1
        javap -c com.zj.study.jvm.bytecode.MyTest1
        javap -verbose com.zj.study.jvm.bytecode.MyTest1
    
        Hex Fiend mac 16进制查看器
    
     */
    public class MyTest1 {
        private int a = 1;
    
        public int getA() {
            return a;
        }
    
        public void setA(int a) {
            this.a = a;
        }
    }
    
    
    CA FE BA BE // 魔数
    00 00 00 32 // 00 00 次版本号 00 32 主版本号
    00 18 // 1 * 16 + 8 -1 = 23个常量
    0A 00 04 00 14 // 0A = 10 表示这是一个方法,00 04 声明方法的类描述符的索引项是4 ,00 14 = 20 指向名称及类型描述符的索引项 
    09 00 03 00 15 // 09 = 9 表示这是一个字段,00 03 声明字段的类或者接口描述组的索引项是3 ,00 15 = 21 指向字段描述符的索引项21
    07 00 16 // 07 = 7 表示这是一个类,00 16 = 22 指向全限定名常量项的索引
    07 00 17 // 07 = 7 表示这是一个类,00 17 = 23 指向全限定名常量项的索引
    01 00 01 61 // 01 = 1 表示这是一个utf-8编码的一个字符串,00 01 = 1 长度为length=1的utf-8编码的字符串,61 内容为 a
    01 00 01 49 // 01 = 1 表示这是一个utf-8编码的一个字符串,00 01 = 1 长度为length=1的utf-8编码的字符串,49 内容为 I
    01 00 06 3C 69 6E 69 74 3E // 01 = 1 表示这是一个utf-8编码的一个字符串,00 06 = 6 长度为length=6的utf-8编码的字符串,内容为 <init>
    01 00 03 28 29 56 // 01 = 1 表示这是一个utf-8编码的一个字符串,00 03 = 3 长度为length=3的utf-8编码的字符串,内容为 ()V
    01 00 04 43 6F 64 65 // 01 = 1 表示这是一个utf-8编码的一个字符串,00 04 = 4 长度为length=4的utf-8编码的字符串,内容为 Code
    01 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65 // 内容为LineNumberTable
    01 00 12 4C 6F 63 61 6C 56 61 72 69 61 62 6C 65 54 61 62 6C 65 // 内容为LocalVariableTable
    01 00 04 74 68 69 73 // 内容为this
    01 00 23 4C 63 6F 6D 2F 7A 6A 2F 73 74 75 64 79 2F 6A 76 6D 2F 62 79 74 65 63 6F 64 65 2F 4D 79 54 65 73 74 31 3B // 内容为Lcom/zj/study/jvm/bytecode/MyTest1;
    01 00 04 67 65 74 41 // 内容为getA
    01 00 03 28 29 49 // 内容为()I 
    01 00 04 73 65 74 41 // 内容为setA
    01 00 04 28 49 29 56 // 内容为(I)V
    01 00 0A 53 6F 75 72 63 65 46 69 6C 65 // 内容为SourceFile
    01 00 0C 4D 79 54 65 73 74 31 2E 6A 61 76 61 0C 00 // 内容为MyTest1.java
    07 00 08 // 07 = 6 表示这是一个类,00 08 = 8 指向全限定名常量项的索引
    0C 00 05 00 06 // 0C=12表示这是一个名称和类型信息,00 05=5,指向该字段或方法名称常量项的索引,00 06=6指向该字段或方法描述符常量的索引
    01 00 21 63 6F 6D 2F 7A 6A 2F 73 74 75 64 79 2F 6A 76 6D 2F 62 79 74 65 63 6F 64 65 2F 4D 79 54 65 73 74 31 // 内容为com/zj/study/jvm/bytecode/MyTest1
    01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 // 内容为java/lang/Object
    00 21 // 访问标识符access_flag
    00 03 // 当前类名 索引,从常量池找
    00 04 // 父类类名 索引,从常量池找
    00 00 // 接口数量 0 没有接口名 
    00 01 // fields_count 字段的数量
    00 02 00 05 00 06 00 00 // 00 02 访问修饰符,00 05 名字索引,00 06 描述符的索引,00 00 附加属性个数
    
    00 03 // 一共有3个方法
    
    00 01 // 第一个方法的访问修饰符
    00 07 // 名字索引 
    00 08 // 描述索引
    00 01 // 附加属性长度是1 
    00 09 // 第一个方法的第一个附加属性名字索引 
    00 00 00 38 // 第一个方法的第一个附加属性长度
    00 02 // max_stack
    00 01 // max_locals
    00 00 00 0A // code_length
    2A B7 00 01 2A 04 B5 00 02 B1 // 真正的执行的内容
    00 00 // 异常表长度
    00 02 // 附加属性的附加的属性 
    00 0A // 附加属性的常量池索引 LineNumberTable
    00 00 00 0A // 长度 10
    00 02 00 00 00 0E 00 04 00 0F // 00 02 lineNumberTable的长度,00 00 字节码指令的偏移量,00 0E 对应源码的行号
    00 0B // 附加属性的常量池索引 LocalVariableTable
    00 00 00 0C // 长度
    00 01 // local_variable_table_length
    00 00 00 0A 00 0C 00 0D 00 00 // 00 00 局部变量的作用域的起始字节码偏移量,00 0A 局部变量的作用域的大小,00 0C 局部变量的变量名索引,00 0D 当前局部变量的描述符索引, 00 00 当前局部变量在栈帧中局部变量表中的位置
    
    00 01 // 第二个方法的访问修饰符
    00 0E // 名字索引 
    00 0F // 描述索引
    00 01 // 附加属性长度是1 
    00 09 // 第二个方法的第一个附加属性名字索引
    00 00 00 2F // 第二个方法的第二个附加属性长度 47
    00 01 // max_stack
    00 01 // max_locals
    00 00 00 05 // code_length
    2A B4 00 02 AC // 真正的执行的内容
    00 00 // 异常表长度
    00 02 // 附加属性的附加的属性 
    00 0A // 附加属性的常量池索引 LineNumberTable
    00 00 00 06 // 长度 6
    00 01 00 00 00 12 // 00 01 lineNumberTable的长度,00 00 字节码指令的偏移量,00 12 对应源码的行号
    00 0B // 附加属性的常量池索引 LocalVariableTable
    00 00 00 0C // 长度
    00 01 // local_variable_table_length
    00 00 00 05 00 0C 00 0D 00 00 // 00 00 局部变量的作用域的起始字节码偏移量,00 05 局部变量的作用域的大小,00 0C 局部变量的变量名索引,00 0D 当前局部变量的描述符索引, 00 00 当前局部变量在栈帧中局部变量表中的位置
    
    00 01 // 第三个方法的访问修饰符
    00 10 // 名字索引 
    00 11 // 描述索引
    00 01 // 附加属性长度是1 
    00 09 // 第三个方法的第一个附加属性名字索引
    00 00 00 3E // 第二个方法的第二个附加属性长度 62
    00 02 
    00 02 
    00 00 00 06 
    2A 1B B5 00 02 B1 
    00 00 
    00 02 
    00 0A 
    00 00 00 0A 
    00 02 00 00 00 16 00 05 00 17 
    00 0B 
    00 00 00 16 
    00 02 
    00 00 00 06 00 0C 00 0D 00 00 00 00 00 06 00 05 00 06 00 01 
    
    00 01 // 类的附加属性1个
    00 12 // 类的附加属性名字索引
    00 00 00 02 // 类的附加属性的长度
    00 13 // 文件名对应的索引
    

    第二个字节码分析

    package com.zj.study.jvm.bytecode;
    
    public class MyTest2 {
        String str = "Welcome";
        private int x = 5;
        public static Integer in = 10;
    
        public MyTest2() {
        }
    
        public static void main(String[] args) {
            MyTest2 myTest2 = new MyTest2();
            myTest2.setX(8);
            in = 20;
        }
    
        public void setX(int x) {
            this.x = x;
        }
    }
    
    CA FE BA BE // 魔数
    00 00 00 32 // 次版本号 主版本号
    00 2F // 常量池个数 = 2 * 16 + 15 - 1 = 46
    0A 00 0A 00 22 // 索引 1 方法 声明方法的类描述符常量池索引 10 指向名称及类型描述符 34
    08 00 23 // 索引 2 字符串字面量的索引 35
    09 00 05 00 24 // 索引 3 字段 声明字段的类或者接口描述符索引 5 指向名称及类型描述符 36
    09 00 05 00 25 // 索引 4  字段 声明字段的类或者接口描述符索引 5 指向名称及类型描述符 37
    07 00 26 // 索引 5 类 全限定名常量项的索引 38
    0A 00 05 00 22 // 索引 6 方法 声明方法的类描述符常量池索引 5 指向名称及类型描述符 34
    0A 00 05 00 27 // 索引 7 方法 声明方法的类描述符常量池索引 5 指向名称及类型描述符 39
    0A 00 28 00 29 // 索引 8 方法 声明方法的类描述符常量池索引 40 指向名称及类型描述符 41
    09 00 05 00 2A // 索引 9 字段 声明字段的类或者接口描述符索引 5 指向名称及类型描述符 42
    07 00 2B // 索引 10 类 全限定名常量项的索引 43
    01 00 03 73 74 72 // 索引 11 字符串 长度 3 内容 str
    01 00 12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B // 索引 12 字符串 长度 18 内容 Ljava/lang/String;
    01 00 01 78 // 索引 13 字符串 长度 1 内容 x
    01 00 01 49 // 索引 14 字符串 长度 1 内容 I
    01 00 02 69 6E // 索引 15 字符串 长度 2 内容 in
    01 00 13 4C 6A 61 76 61 2F 6C 61 6E 67 2F 49 6E 74 65 67 65 72 3B // 索引 16 字符串 长度 19 内容 Ljava/lang/Integer;
    01 00 06 3C 69 6E 69 74 3E // 索引 17 字符串 长度 6 内容 <init>
    01 00 03 28 29 56 // 索引 18 字符串 长度 3 内容 ()V
    01 00 04 43 6F 64 65 // 索引 19 字符串 长度 4 内容 Code
    01 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65 // 索引 20 字符串 长度 15 内容 LineNumberTable
    01 00 12 4C 6F 63 61 6C 56 61 72 69 61 62 6C 65 54 61 62 6C 65 // 索引 21 字符串 长度 18 内容 LocalVariableTable
    01 00 04 74 68 69 73 // 索引 22 字符串 长度 4 内容 this
    01 00 23 4C 63 6F 6D 2F 7A 6A 2F 73 74 75 64 79 2F 6A 76 6D 2F 62 79 74 65 63 6F 64 65 2F 4D 79 54 65 73 74 32 3B // 索引 23 字符串 长度 35 内容 Lcom/zj/study/jvm/bytecode/MyTest2;
    01 00 04 6D 61 69 6E // 索引 24 字符串 长度 4 内容 main
    01 00 16 28 5B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56 // 索引 25 字符串 长度 22 内容 ([Ljava/lang/String;)V
    01 00 04 61 72 67 73 // 索引 26 字符串 长度 4 内容 args
    01 00 13 5B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B // 索引 27 字符串 长度 19 内容 [Ljava/lang/String;
    01 00 07 6D 79 54 65 73 74 32 // 索引 28 字符串 长度 7 内容 myTest2
    01 00 04 73 65 74 58 // 索引 29 字符串 长度 4 内容 setX
    01 00 04 28 49 29 56 // 索引 30 字符串 长度 4 内容 (I)V
    01 00 08 3C 63 6C 69 6E 69 74 3E // 索引 31 字符串 长度 8 内容 <clinit>
    01 00 0A 53 6F 75 72 63 65 46 69 6C 65 // 索引 32 字符串 长度 10 内容 SourceFile
    01 00 0C 4D 79 54 65 73 74 32 2E 6A 61 76 61 // 索引 33 字符串 长度 12 内容 MyTest2.java
    0C 00 11 00 12 // 索引 34 名称和字段类型 指向该字段或方法名称常量项索引 17 指向该字段或方法描述符常量项索引 18
    01 00 07 57 65 6C 63 6F 6D 65 // 索引 35 字符串 长度 7 内容 Welcome
    0C 00 0B 00 0C // 索引 36 名称和字段类型 指向该字段或方法名称常量项索引 11 指向该字段或方法描述符常量项索引 12
    0C 00 0D 00 0E // 索引 37 名称和字段类型 指向该字段或方法名称常量项索引 13 指向该字段或方法描述符常量项索引 14
    01 00 21 63 6F 6D 2F 7A 6A 2F 73 74 75 64 79 2F 6A 76 6D 2F 62 79 74 65 63 6F 64 65 2F 4D 79 54 65 73 74 32 // 索引 38 字符串 长度 33 内容 com/zj/study/jvm/bytecode/MyTest2
    0C 00 1D 00 1E // 索引 39 名称和字段类型 指向该字段或方法名称常量项索引 29 指向该字段或方法描述符常量项索引 30
    07 00 2C // 索引 40 类 全限定名常量项的索引 44
    0C 00 2D 00 2E // 索引 41 名称和字段类型 指向该字段或方法名称常量项索引 45 指向该字段或方法描述符常量项索引 46
    0C 00 0F 00 10 // 索引 42 名称和字段类型 指向该字段或方法名称常量项索引 15 指向该字段或方法描述符常量项索引 16
    01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 // 索引 43 字符串 长度 16 内容 java/lang/Object
    01 00 11 6A 61 76 61 2F 6C 61 6E 67 2F 49 6E 74 65 67 65 72 // 索引 44 字符串 长度 17 内容 java/lang/Integer
    01 00 07 76 61 6C 75 65 4F 66 // 索引 45 字符串 长度 7 内容 valueOf
    01 00 16 28 49 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 49 6E 74 65 67 65 72 3B // 索引 46 字符串 长度 22 内容 (I)Ljava/lang/Integer;
    00 21 // 类访问标志
    00 05 // 当前类名字 常量池索引为5
    00 0A // 父类名字 常量池索引为10
    00 00 // 接口个数
    00 03 // 成员变量个数 3
    00 00 00 0B 00 0C 00 00 2个字节访问修饰符 2个字节名字索引 2个字节描述符索引 2个字节字段拥有的独有的属性信息
    00 02 00 0D 00 0E 00 00 
    00 09 00 0F 00 10 00 00 
    00 04 // 4个方法 
    00 01 // 第一个方法的访问修饰符
    00 11 // 第一个方法的名字索引
    00 12 // 第一个方法的描述符索引
    00 01 // 第一个方法拥有的属性信息
    00 13 // 第一个方法的第一个属性的名字索引 
    00 00 00 42 // 第一个方法的第一个属性的长度
    00 02 
    00 01 
    00 00 00 10 
    2A B7 00 01 2A 12 02 B5 00 03 2A 08 B5 00 04 B1 
    00 00 
    00 02 
    00 14 
    00 00 00 0E 
    00 03 00 00 00 03 00 04 00 04 00 0A 00 05 
    00 15 
    00 00 00 0C 
    00 01 00 00 00 10 00 16 00 17 00 00 
    
    00 09 // 第二个方法的访问修饰符
    00 18 // 名字索引
    00 19 // 描述符索引
    00 01 // 属性个数
    00 13 // Code
    00 00 00 57 // 长度
    00 02 
    00 02 
    00 00 00 17 
    BB 00 05 59 B7 00 06 4C 2B 10 08 B6 00 07 10 14 B8 00 08 B3 00 09 B1 
    00 00 
    00 02 
    00 14 
    00 00 00 12 
    00 04 00 00 00 0A 00 08 00 0B 00 0E 00 0C 00 16 00 0D 
    00 15 
    00 00 00 16 
    00 02 00 00 00 17 00 1A 00 1B 00 00 00 08 00 0F 00 1C 00 17 00 01
    
    00 01 
    00 1D 
    00 1E 
    00 01 
    00 13 
    00 00 00 3E 
    00 02 
    00 02 
    00 00 00 06 
    2A 1B B5 00 04 B1 
    00 00 
    00 02 
    00 14 
    00 00 00 0A 
    00 02 00 00 00 10 00 05 00 11 
    00 15 
    00 00 00 16 
    00 02 00 00 00 06 00 16 00 17 00 00 00 00 00 06 00 0D 00 0E 00 01 
    
    00 08 
    00 1F 
    00 12 
    00 01 
    00 13 
    00 00 00 21 
    00 01 
    00 00 
    00 00 00 09 
    10 0A B8 00 08 B3 00 09 B1 
    00 00 
    00 01 
    00 14 
    00 00 00 06
    00 01 00 00 00 07 
    
    00 01 
    00 20 
    00 00 00 02 
    00 21
    

    第三个字节码分析

    package com.zj.study.jvm.bytecode;
    
    public class MyTest2 {
        String str = "Welcome";
        private int x = 5;
    
        public static Integer in = 10;
    
        public static void main(String[] args) {
            MyTest2 myTest2 = new MyTest2();
            myTest2.setX(8);
            in = 20;
        }
    
        public synchronized void setX(int x) {
            this.x = x;
        }
    
        private void test(String test) {
            synchronized (this.str) {
                System.out.println("Hello World");
            }
        }
    
        private synchronized static void test2() {
            
        }
    }
    
    CA FE BA BE 
    00 00 00 32 
    00 46 // 4 * 16 + 6 - 1 = 69
    
    0A 00 0D 00 2D 
    08 00 2E 
    09 00 05 00 2F 
    09 00 05 00 30 
    07 00 31 
    0A 00 05 00 2D 
    0A 00 05 00 32 
    0A 00 33 00 34 
    09 00 05 00 35 
    09 00 36 00 37 
    08 00 38 
    0A 00 39 00 3A 
    07 00 3B 
    01 00 03 73 74 72 
    01 00 12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 
    01 00 01 78 
    01 00 01 49 
    01 00 02 69 6E 
    01 00 13 4C 6A 61 76 61 2F 6C 61 6E 67 2F 49 6E 74 65 67 65 72 3B 
    01 00 06 3C 69 6E 69 74 3E 
    01 00 03 28 29 56 
    01 00 04 43 6F 64 65 
    01 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65 
    01 00 12 4C 6F 63 61 6C 56 61 72 69 61 62 6C 65 54 61 62 6C 65 
    01 00 04 74 68 69 73 
    01 00 23 4C 63 6F 6D 2F 7A 6A 2F 73 74 75 64 79 2F 6A 76 6D 2F 62 79 74 65 63 6F 64 65 2F 4D 79 54 65 73 74 32 3B 
    01 00 04 6D 61 69 6E 
    01 00 16 28 5B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56 
    01 00 04 61 72 67 73 
    01 00 13 5B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 
    01 00 07 6D 79 54 65 73 74 32 
    01 00 04 73 65 74 58 
    01 00 04 28 49 29 56 
    01 00 04 74 65 73 74 
    01 00 15 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56 
    01 00 0D 53 74 61 63 6B 4D 61 70 54 61 62 6C 65 
    07 00 31 
    07 00 3C 
    07 00 3B 
    07 00 3D 
    01 00 05 74 65 73 74 32 
    01 00 08 3C 63 6C 69 6E 69 74 3E 
    01 00 0A 53 6F 75 72 63 65 46 69 6C 65 
    01 00 0C 4D 79 54 65 73 74 32 2E 6A 61 76 61 
    0C 00 14 00 15 
    01 00 07 57 65 6C 63 6F 6D 65 
    0C 00 0E 00 0F 
    0C 00 10 00 11 
    01 00 21 63 6F 6D 2F 7A 6A 2F 73 74 75 64 79 2F 6A 76 6D 2F 62 79 74 65 63 6F 64 65 2F 4D 79 54 65 73 74 32 
    0C 00 20 00 21 
    07 00 3E 
    0C 00 3F 00 40 
    0C 00 12 00 13 
    07 00 41 
    0C 00 42 00 43 
    01 00 0B 48 65 6C 6C 6F 20 57 6F 72 6C 64 
    07 00 44 
    0C 00 45 00 23 
    01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 
    01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 
    01 00 13 6A 61 76 61 2F 6C 61 6E 67 2F 54 68 72 6F 77 61 62 6C 65 
    01 00 11 6A 61 76 61 2F 6C 61 6E 67 2F 49 6E 74 65 67 65 72 
    01 00 07 76 61 6C 75 65 4F 66 
    01 00 16 28 49 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 49 6E 74 65 67 65 72 3B 
    01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 53 79 73 74 65 6D 
    01 00 03 6F 75 74 
    01 00 15 4C 6A 61 76 61 2F 69 6F 2F 50 72 69 6E 74 53 74 72 65 61 6D 3B 
    01 00 13 6A 61 76 61 2F 69 6F 2F 50 72 69 6E 74 53 74 72 65 61 6D 
    01 00 07 70 72 69 6E 74 6C 6E 
    
    00 21 
    00 05 
    00 0D 
    00 00 // 接口数量
    00 03 // 3个字段
    00 00 00 0E 00 0F 00 00 
    00 02 00 10 00 11 00 00 
    00 09 00 12 00 13 00 00 
    
    00 06 // 6个方法 
    
    00 01 
    00 14 
    00 15 
    00 01 
    00 16 // Code
    00 00 00 42 
    00 02 
    00 01 
    00 00 00 10 
    2A B7 00 01 2A 12 02 B5 00 03 2A 08 B5 00 04 B1 
    00 00 
    00 02 
    00 17 // LineNumberTable
    00 00 00 0E 
    00 03 00 00 00 03 00 04 00 04 00 0A 00 05 
    00 18 // LocalVariableTable
    00 00 00 0C 
    00 01 00 00 00 10 00 19 00 1A 00 00 
    
    00 09 
    00 1B 
    00 1C 
    00 01 
    00 16 // Code
    00 00 00 57 
    00 02 
    00 02 
    00 00 00 17 
    BB 00 05 59 B7 00 06 4C 2B 10 08 B6 00 07 10 14 B8 00 08 B3 00 09 B1 
    00 00 
    00 02 
    00 17 
    00 00 00 12 
    00 04 00 00 00 0A 00 08 00 0B 00 0E 00 0C 00 16 00 0D 
    00 18 
    00 00 00 16 
    00 02 00 00 00 17 00 1D 00 1E 00 00 00 08 00 0F 00 1F 00 1A 00 01 
    
    00 21 
    00 20 
    00 21 
    00 01 
    00 16 
    00 00 00 3E 
    00 02 
    00 02 
    00 00 00 06 
    2A 1B B5 00 04 B1 
    00 00 
    00 02 
    00 17 
    00 00 00 0A 
    00 02 00 00 00 10 00 05 00 11 
    00 18 
    00 00 00 16 
    00 02 00 00 00 06 00 19 00 1A 00 00 00 00 00 06 00 10 00 11 00 01 
    
    00 02 
    00 22 
    00 23 
    00 01 
    00 16 
    00 00 00 88 
    00 02 
    00 04 
    00 00 00 1A 
    2A B4 00 03 59 4D C2 B2 00 0A 12 0B B6 00 0C 2C C3 A7 00 08 4E 2C C3 2D BF B1 
    00 02 // 异常
    00 07 00 11 00 14 00 00 
    00 14 00 17 00 14 00 00 
    00 03 
    00 17 
    00 00 00 12 
    00 04 00 00 00 14 00 07 00 15 00 0F 00 16 00 19 00 17 
    00 18 
    00 00 00 16 
    00 02 00 00 00 1A 00 19 00 1A 00 00 00 00 00 1A 00 22 00 0F 00 01 
    00 24 //StackMapTable
    00 00 00 18 
    00 02 FF 00 14 00 03 07 00 25 07 00 26 07 00 27 00 01 07 00 28 FA 00 04 
    
    00 2A 
    00 29 
    00 15 
    00 01 
    00 16 // Code
    00 00 00 19 
    00 00 
    00 00 
    00 00 00 01 
    B1 
    00 00 
    00 01 
    00 17 // LineNumberTable
    00 00 00 06 
    00 01 00 00 00 1B 
    
    00 08 
    00 2A 
    00 15 
    00 01 
    00 16 // Code
    00 00 00 21 
    00 01 
    00 00 
    00 00 00 09 
    10 0A B8 00 08 B3 00 09 B1 
    00 00 
    00 01 
    00 17 // LineNumberTable
    00 00 00 06 
    00 01 00 00 00 07 
    
    00 01 
    00 2B // SourceFile
    00 00 00 02 
    00 2C // MyTest2.java
    

    相关文章

      网友评论

          本文标题:14. 三个字节码分析

          本文链接:https://www.haomeiwen.com/subject/racxqhtx.html