前言
当程序使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、链接、初始化三个步骤对该类进行类加载。
Java Class文件
class文件是一组以8位字节为基础的二进制流,各个数据项目按照顺序排列在class文件中,中间没有任何分隔符。因此整个 class 文件中存储的内容几乎全是程序运行时的必要数据。当遇到需要占用8位以上字节空间的数据项时,会按照高位在前的方式分割成若干个8位字节存储。
分享一张JVM知识图谱:(关注我分享更多干货喔下↓↓↓)
我们首先需要定义一个Java类:
public class SumDemo {
public static void main(String[] args) {
int a=1;
int b=2;
System.out.println(a+b);
}
}
1.2.3.4.5.6.7.8.
我们知道编写的Java代码是不能直接运行的,需要变成class文件才行。这个编译。需要用JDK内置的Java对命令就可以实现了。
比如,我们生成某一个类的字节码文件,只需要使用javac SumDemo.java 即可以获得一个 class 文件。当然了,在实际项目中,我们一般都不会人工用 javac 命令去编译,而是借助 IDE 或者是 Maven、Grande 等等工具,帮助我们更加方便的把 Java 代码编译成class文件。
编译出来的class文件并不是一个文本文件,它是没有办法直接打开阅读的,比如我们使用notepad++打开,可以发现是一片乱码。
那么如果想要阅读的话,可以使用 java p 命令反编译一下。这是一个 Java 内置的反编译工具,我们来看看怎么用。
如下图所示:
下面是使用 javap -v -p 反编译生成的文件。注意的是,在这个时候不需要跟上 .java,因为反编译的是 class 文件,这样就可以看到 class 文件里面的内容。同时也可将其输出到一个 .txt 文件,使用的命令是:javap -v -p xxx > xxx.txt 。
E:\JavaSpace\Java-Prepare-Lesson\Java-High\JVM-Frame\JVM-Chapter01-Demo\src\main\java\com\itbbfx>javap -v -p SumDemo
警告: 二进制文件SumDemo包含com.itbbfx.SumDemo
#描述信息
Classfile /E:/JavaSpace/Java-Prepare-Lesson/Java-High/JVM-Frame/JVM-Chapter01-Demo/src/main/java/com/itbbfx/SumDemo.class
Last modified 2021-5-16; size 409 bytes
MD5 checksum b9b13ea5dba3f2b62f4764d30eafc7fc
Compiled from "SumDemo.java"
#描述信息
public class com.itbbfx.SumDemo
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
#常量池
Constant pool:
#1 = Methodref #5.#14 // java/lang/Object."<init>":()V
#2 = Fieldref #15.#16 // java/lang/System.out:Ljava/io/PrintStream;
#3 = Methodref #17.#18 // java/io/PrintStream.println:(I)V
#4 = Class #19 // com/itbbfx/SumDemo
#5 = Class #20 // java/lang/Object
#6 = Utf8 <init>
#7 = Utf8 ()V
#8 = Utf8 C