14. 三个字节码分析

2020-02-20  本文已影响0人  ZFH__ZJ

第一个字节码分析

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
上一篇下一篇

猜你喜欢

热点阅读