第14章_Class文件概述

1.1字节码文件是什么

在Java编程语言中,Class文件是Java源代码编译后生成的二进制文件。它包含了编译后的Java字节码以及类信息和元数据。每个Java类都对应一个Class文件,这个文件中包含了该类的所有信息,包括其成员变量、方法、父类和接口信息等。

在Java应用程序运行时,JVM会根据Class文件来加载和解释字节码,以便正确地执行Java程序。因此,Class文件是Java应用程序的基础,并且在Java EE中扮演着非常重要的角色,它被广泛用于类加载器和反射等机制中。

需要注意的是,Class文件中的字节码是一种平台中立的代码格式,可以在任何支持Java的平台上运行,这也是Java语言和平台跨平台的一个重要特性。

1.2什么是字节码指令

Java虛拟机的指令由一个字节长度的、代表着某种特定操作含义的操作码( opcode)以及跟随其后的零至多个代表此操作所需参数的操作数( operand)所构成。虚拟机中许多指令并不包含操作数,只有一个操作码

image-20230627092349169

1.3解析字节码的作用

通过反编译生成的字节码文件,我们可以深入的了解java代码的工作机制。除了使用第三方的jclasslib工具之外,oracle官方也提供了工具: javap

javap是jdk自带的反解析工具。它的作用就是根据class字节码文件,反解析出当前类对应的code区(字节码指令)、局部变量表、异常表和代码行偏移量映射表、常量池等信息。

通过局部变量表,我们可以查看局部变量的作用域范围、所在槽位等信息,甚至可以看到槽位复用等信息。

1.4javac操作

解析字节码文件得到的信息中,有些信息(如局部变量表、指令和代码行偏移量映射表、常量池中方法的参数名称等等)需要在使用javac编译成class文件时,指定参数才能输出。

比如,你直接javac xx.java 就不会在生成对应的局部变量表等信息,如果你使用javac -g xx.java就可以生成所有相关信息了。

javac -g java文件名

1.5javap操作

javap的用法格式:

javap <options> <classes>

其中,classes就是你要反编译的class文件。

一般常用的是-v -l -c三个选项。

  • javap -v classxx 除了包含-c内容外,还会输出行号、局部变量表信息、常量池等信息。
  • javap -l会输出行号和本地变量表信息。
  • javap -c会对当前class字节码进行反编译生成汇编代码。

第14章_Class文件概述
https://xhablog.online/2022/05/22/JVM-第14章_Class文件概述/
作者
Xu huaiang
发布于
2022年5月22日
许可协议