欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

17.字节码中方法内部结构分析-Jclasslib的使用

程序员文章站 2024-03-16 23:31:16
...

1.使用Jclasslib分析字节码中的方法内部结构

1.安装jclasslib bytecode viewer。进入https://github.com/ingokegel/jclasslib下载最新版的Jclasslib并且安装。
2.编译下面的java代码,生成LocalVariablesTest .class文件。

package jvm;

import java.util.Date;

public class LocalVariablesTest {
    private int count = 0;
    public static void main(String[] args) {
        LocalVariablesTest test = new LocalVariablesTest();
        int num = 10;
    }

    //练习:
    public static void testStatic(){
        LocalVariablesTest test = new LocalVariablesTest();
        Date date = new Date();
        int count = 10;
        System.out.println(count);
        //因为this变量不存在于当前方法的局部变量表中!!
//        System.out.println(this.count);
    }
}

3.使用安装好的jclasslib 打开LocalVariablesTest .class。
17.字节码中方法内部结构分析-Jclasslib的使用
4.字节码方法内部结构分析
4.1: 如下图所示,找到Methods并且展开,里面包含了java文件中定义的所有的方法。<init>对应着构造方法。选中main方法。
Name:方法名
Description:描述了方法的参数类型以及返回值类型。比如<([Ljava/lang/String;)V>,说明参数类型是Ljava/lang/String;返回值类型是V,表示的是void类型。
Access flags:访问标识。public static。
17.字节码中方法内部结构分析-Jclasslib的使用
4.2:进一步展开main方法。选中Code

a) Bytecode:字节码指令。java方法对应的字节码指令。
17.字节码中方法内部结构分析-Jclasslib的使用
b) Exception table:方法抛出的异常。由于main方法没有抛出异常,所以什么都没有。
17.字节码中方法内部结构分析-Jclasslib的使用
c) Misc里面包含了一些描述信息。
Maximum local variables:局部变量表最大的长度。当前例子为3。
Code length:code的length。指的是 Bytecode字节码指令中的行数。例子中是0-11,所以是12行。
17.字节码中方法内部结构分析-Jclasslib的使用
4.3:进一步选中LineNumberTable:行号表。表示的是字节码的指令行号与java文件中的代码的行号的对应关系。
例如图中的Start PC列8和Line Number列的9对应。表示的是字节码指令的第8行对应的是java代码的第9行。
17.字节码中方法内部结构分析-Jclasslib的使用
4.4:进一步选中LocalVariablesTable:局部变量表。
Start PC:字节码指令行号,表示的是变量声明的起始位置。
Length:变量作用域范围。从起始位置开始,变量可用的行长度。例如图中的Start PC列8和Length列的4,表示的是test变量从字节码指令的第8行开始声明,可用的行长度为4,也就是8-11这4行可以使用。(切换Jclasslib的视图到code->Bytecode便于理解)。
Index:索引。jvm通过索引使用局部变量。
Name:局部变量的名称。
Descriptor:描述局部变量的类型。I表示的是int。
17.字节码中方法内部结构分析-Jclasslib的使用